Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

%MATCHES

値をリテラル、ワイルドカード、および範囲を含むパターン文字列とマッチングします。

Synopsis

scalar-expression %MATCHES pattern [ESCAPE char]

引数

scalar-expression 値を pattern と比較するスカラ式 (通常はデータ列)。
pattern scalar-expression の各値とマッチングする文字パターンを表す、引用符付きの文字列。pattern 文字列には、リテラル文字列、疑問符 (?) およびアスタリスク (%) ワイルドカード、許可する値を指定するための角括弧、直後の文字をリテラルとして処理するよう指定するための円記号 (\) を含めることができます。pattern には、空文字列または NULL を指定することもできますが、その場合はマッチングが行われないか NULL 項目が返されます。
ESCAPE char Optional — 1 文字を含む文字列。この char 文字は、pattern 内でその直後の文字をリテラルとして処理するよう指定するために使用されます。指定されない場合、既定のエスケープ文字は円記号 (\) です。

説明

%MATCHES 述語は、値とパターン文字列とをマッチングするための Caché の拡張機能です。%MATCHES は、マッチング演算に対して True または False を返します。pattern 文字列は、リテラル文字列、ワイルドカード文字、およびマッチング・リテラルのリストまたは範囲で構成できます。

パターン・マッチでは大文字と小文字が区別されます。パターン・マッチは、照合値でなく、scalar-expression の EXACT 値に基づいています。したがって、scalar-expression照合タイプで大文字と小文字が区別されない場合でも、%MATCHES 処理では大文字と小文字が常に区別されます。

%MATCHES は、次の pattern ワイルドカードをサポートします。

? 任意の型の任意の 1 文字と一致。
* 任意の型の 0 文字以上の文字と一致。
[abc] 角括弧内に指定された文字のいずれかと一致。
[a-z] 角括弧内に指定された範囲内の文字 (範囲の最初の文字と最後の文字も含む) と一致。

[^A-Z]

[^a-z]

[^0–9]

角括弧内に指定された文字以外の任意の文と一致。この構文を使用して、大文字以外、小文字以外、数字以外などを指定できます。ここで示したリテラル範囲のみがサポートされます。
\ 直後の文字を、ワイルドカード文字としてではなく、リテラル文字として処理します。円記号が既定のエスケープ文字ですが、オプションの ESCAPE 節を使用して、別の文字をエスケープ文字として指定することもできます。

ほとんどの述語と同様に、%MATCHES は NOT 演算子を使用して反転できます。例えば、item NOT %MATCHES pattern のようにします。%MATCHESNOT %MATCHES も、NULL フィールドを返すために使用することはできません。NULL フィールドを返すには、IS NULL を使用します。

円記号 (\) 文字が既定のエスケープ文字です。このエスケープ文字を使用して、指定されたパターンの位置でワイルドカード文字をリテラル・マッチとして使用するように指定できます。例えば、疑問符を文字列の最初の文字としてマッチさせるには、'\?*' と指定します。疑問符を文字列の 4 番目の文字としてマッチさせるには、'???\?*' と指定します。文字列の任意の場所にある疑問符をマッチさせるには、'*\?*' と指定します。アスタリスク文字のみで構成される文字列をマッチさせるには、'\*' と指定します。少なくとも 1 つのアスタリスク文字を含む文字列をマッチさせるには、'*\**' と指定します。文字列の任意の場所にある円記号をマッチさせるには、'*\\*'と指定します。

述語条件を指定できる場所であればどこでも、%MATCHES を使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。

%MATCHES は、Informix SQL との互換性を保つためにサポートされています。

%SelectMode

%MATCHES 述語は、現在の %SelectMode 設定を使用しません。pattern は、%SelectMode 設定に関係なく、論理形式で指定する必要があります。pattern を ODBC 形式または表示形式で指定しようとすると、通常は、データが一致しないか、意図していないデータと一致することになります。

%EXTERNAL または %ODBCOUT 形式変換関数を使用すると、述語による操作対象となる scalar-expression フィールドを変換できます。これにより、表示形式または ODBC 形式で pattern を指定できるようになります。ただし、形式変換関数を使用すると、そのフィールドのためのインデックスを使用できなくなり、それによってパフォーマンスに大きな影響を与える可能性があります。

以下のダイナミック SQL の例では、%MATCHES 述語で、%SelectMode=1 (ODBC) の形式ではなく論理形式で日付の pattern を指定します。41 で始まる DOB 論理値がある行 (1953 年 4 月 4 日 ($HOROLOG 41000) から 1955 年 12 月 28 日 ($HOROLOG 41999) までの日付) が選択されます。

  ZNSPACE "SAMPLES"
  SET q1 = "SELECT Name,DOB FROM Sample.Person "
  SET q2 = "WHERE DOB %MATCHES '41*'"
  SET myquery = q1_q2
  SET tStatement = ##class(%SQL.Statement).%New()
  SET tStatement.%SelectMode=1
  SET qStatus = tStatement.%Prepare(myquery)
    IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

以下のダイナミック SQL の例では、%ODBCOUT 形式変換関数を使用して、述語によって、一致した DOB フィールドを変換します。これにより、ODBC 形式で %MATCHES pattern を指定できるようになります。それにより、 DOB フィールドの ODBC 値が 195 で始まる行 (1950 年から 1959 年の範囲内の日付) が選択されます。ただし、形式変換関数を指定すると、DOB フィールド値のためのインデックスを使用できなくなります。

  ZNSPACE "SAMPLES"
  SET q1 = "SELECT Name,DOB FROM Sample.Person "
  SET q2 = "WHERE %ODBCOUT(DOB) %MATCHES '195*'"
  SET myquery = q1_q2
  SET tStatement = ##class(%SQL.Statement).%New()
  SET tStatement.%SelectMode=1
  SET qStatus = tStatement.%Prepare(myquery)
    IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

以下の例は、“A” で始まる姓をすべて返します。

SELECT Name FROM Sample.Person 
WHERE Name %MATCHES 'A*'

以下の例は、“A” で始まる名前をすべて返します。

SELECT Name FROM Sample.Person 
WHERE Name %MATCHES '*,A*'

以下の例は、“A” という文字を含むフルネーム (姓、名前、ミドルネーム) をすべて返します。

SELECT Name FROM Sample.Person 
WHERE Name %MATCHES '*A*'

以下の例は、“A”、“a”、“E”、“e” を含まないフルネームをすべて返します。

SELECT Name FROM Sample.Person 
WHERE Name NOT %MATCHES '*[AaEe]*'

以下の例は、“A” ~ “D” で始まる名前を持つ 5 文字の姓をすべて返します。

SELECT Name FROM Sample.Person 
WHERE Name %MATCHES '?????,[A-D]*'

関連項目

FeedbackOpens in a new tab