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?

%PATTERN

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

Synopsis

scalar-expression %PATTERN pattern

引数

scalar-expression 値を pattern と比較するスカラ式 (通常はデータ列)。
pattern scalar-expression の各値とマッチングする文字パターンを表す、引用符付きの文字列。pattern 文字列には、二重引用符で囲まれたリテラル文字、文字のタイプを指定する文字コード、およびワイルドカード文字としての数字およびピリオド (.) 文字を含めることができます。

概要

%PATTERN 述語を使用すると、文字タイプ・コードおよびリテラルのパターンを scalar-expression で指定されたデータの値と比較できます。pattern がスカラ式の値と完全に一致した場合、その値が返されます。pattern がスカラ式のいずれの値とも完全一致しない場合は、%PATTERN は NULL 文字列を返します。

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

%PATTERN は、ObjectScript のパターン・マッチ演算子と同じパターン・コード (? 演算子) を使用します。パターンは、反復数とその直後の値のペアを 1 つ以上並べて構成します。反復数は、整数、ピリオド(.) (“任意の文字数” を意味します)、またはピリオドと整数を組み合わせて範囲を指定できます。値は文字タイプ・コードの文字か (引用符を付けた) リテラル文字列を指定できます。

パターンは全体のデータ値と正確にマッチングする必要があるために、反復数/値のペアを複数並べて構成する場合もあります。そのため、多くのパターンは “.E” のペアで終わります。これは、残りのデータの値は任意のタイプの任意の文字数で構成できることを意味します。

パターン・マッチング・ペアの簡単な例をいくつか示します。

  • 1L は、1 文字の小文字を意味します。

  • 1"L" は、1 文字のリテラル “L” を意味します。

  • 1"617" は、1 つのリテラル文字列 “617” を意味します。

  • .U は、任意の数の大文字を意味します。

  • .E は、任意のタイプの任意の数の表示可能文字を意味します。

  • .3A は、最大 3 文字まで (3 文字以下) の任意数の文字 (大文字または小文字) を意味します。

  • 3.N は、3 桁以上の数字を意味します。

  • 3.6N は、3 ~ 6 桁の数字を意味します。

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

ダイナミック SQL では、SQL クエリは二重引用符で区切り、ObjectScript 文字列として指定されます。このような理由から、pattern 文字列内の二重引用符を二重にする必要があります。したがって、米ドル額のためのパターン '1"$"1.N1"."2N' は、ダイナミック SQL では '1""$""1.N1"".""2N' と指定されます。

パターン・コードの詳細は、"Caché ObjectScript の使用法" の "演算子と式" の章にある "パターン・マッチング" を参照してください。

%SelectMode

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

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

以下のダイナミック SQL の例では、%PATTERN 述語で、%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 %PATTERN '1""41""3N' "
  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 形式で %PATTERN pattern を指定できるようになります。それにより、 DOB フィールドの ODBC 値が 195 で始まる行 (1950 年から 1959 年の範囲内の日付) が選択されます。ただし、形式変換関数を指定すると、DOB フィールド値のためのインデックスを使用できなくなります。

  ZNSPACE "SAMPLES"
  SET q1 = "SELECT Name,DOB FROM Sample.Person "
  SET q2 = "WHERE %ODBCOUT(DOB) %PATTERN '1""195"".E' "
  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"

以下の例は、%PATTERN 演算子を WHERE 節の中で使用して、1 文字目が任意の大文字で 2 文字目が “C” である Home_State の値を選択します。

SELECT Name,Home_State FROM Sample.Person
WHERE Home_State %PATTERN '1U1"C"'

この例では、Home_State に North Carolina (NC) や South Carolina (SC) の値を持つレコードが選択されます。

以下の例は、%PATTERN 演算子を WHERE 節の中で使用して、1 文字目が大文字で 2 文字目が小文字である Name の値を選択します。

SELECT Name FROM Sample.Person
WHERE Name %PATTERN '1U1L.E'

ここでのパターンは以下のように解釈されます: 1U (1 文字の大文字)、その後に 1L (1 文字の小文字)、その後に .E (任意のタイプの任意の数の文字)。このパターンでは、”JONES”、O'Reilly”、“deGastyne” などの名前は除外されます。

以下の例は、%PATTERN 演算子を HAVING 節の中で使用して、名前が “Jo” で始まる人のレコードを選択し、検索されたレコードと返されたレコードのカウントを返します。

SELECT Name,
       COUNT(Name) AS TotRecs,
       COUNT(Name %AFTERHAVING) AS JoRecs
FROM Sample.Person
HAVING Name %PATTERN '1U.L1","1"Jo".E'

ここでは、Name フィールドの値は Lastname,Firstname というフォーマットで、オプションでミドル・ネームやイニシャルが含まれる場合もあります。この氏名のフォーマットを反映するために、ここでのパターンは以下のように解釈されます: 1U (1 文字の大文字)、その後に .L (任意の数の小文字)、その後に 1"," (1 文字のリテラルのコンマ)、その後に 1"Jo" (値が “Jo”) の 1 つのリテラル文字列)、その後に .E (任意のタイプの任意の数の文字)。

関連項目

FeedbackOpens in a new tab