%STARTSWITH
Synopsis
scalar-expression %STARTSWITH substring
引数
scalar-expression | その値を substring と比較するスカラ式 (通常はデータ列)。 |
substring | scalar-expression の値とマッチングする先頭文字 (列) を含む文字列または数値を評価する式。 |
概要
%STARTSWITH 述語を使用して、substring で指定する 1 つ以上の文字から始まるデータを選択できます。substring がスカラ式のいずれの値とも一致しない場合は、%STARTSWITH は NULL 文字列を返します。表示モードに関係なく、この照合は常に、論理 (内部保存) データ値に対して実行されます。
述語条件を指定できる場所であればどこでも、%STARTSWITH を使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。
以下の例は、"M" で始まる名前をすべて選択します。
SELECT Name FROM Sample.MyTest WHERE Name %STARTSWITH 'M'
NOT を使用して、述語の意味を反対にすることができます。以下の例は、"M" で始まる名前を除くすべての名前を選択します。
SELECT Name FROM Sample.MyTest WHERE NOT Name %STARTSWITH 'M'
照合タイプ
%STARTSWITH はマッチングの対象となるフィールドと同じ照合タイプを使用します。既定では、文字列データ型フィールドは大文字と小文字が区別されない SQLUPPER 照合で定義されます。現在のネームスペースにおける既定の文字列の照合の定義およびフィールド/プロパティの定義における既定以外のフィールドの照合タイプの指定の詳細は、"Caché SQL の使用法" の “照合” の章を参照してください。
照合タイプ EXACT、UPPER、または ALPHAUP で定義されているフィールドに %STARTSWITH を適用すると、予期しない結果になる可能性があります。詳細は、"Caché SQL の使用法" の "従来の照合タイプ" を参照してください。
以下の例では、UpName が SQLUPPER として定義されており、substring のマッチングで大文字と小文字が区別されません。
SELECT UpName FROM Sample.MyTest WHERE UpName %STARTSWITH 'mo'
異なる照合タイプを WHERE 節の列に割り当てると、この照合タイプで %STARTSWITH substring のリテラル値がマッチングされます。
以下の例では、UpName が SQLUPPER として定義されていますが、substring のマッチングは EXACT になります (大文字と小文字が区別されます)。
SELECT UpName FROM Sample.MyTest WHERE %EXACT(UpName) %STARTSWITH 'mo'
一部の照合関数は、フィールド値にスペース文字を追加します。これにより、同等の照合関数を substring に適用する場合を除いて、%STARTSWITH で値がマッチングされない可能性があります。
以下の例では、ExactName が EXACT として定義されています。クエリによって %SQLUPPER が scalar-expression に適用されるため、追加されたスペース文字で始まる文字列が比較に含まれます。この比較では、フィールドは返されません。
SELECT ExactName FROM Sample.MyTest WHERE %SQLUPPER(ExactName) %STARTSWITH 'Ra'
したがって、スペース文字を substring にも追加する必要があります。以下の例では、大文字と小文字を区別しないマッチングが EXACT フィールドに適用されています。
SELECT ExactName FROM Sample.MyTest WHERE %SQLUPPER(ExactName) %STARTSWITH %SQLUPPER('Ra')
以下に、大文字と小文字を区別せず、スペースと句読点 (コンマを除く) を無視する %STARTSWITH 文字列比較を示します。
SELECT Name FROM Sample.Person
WHERE %STRING(Name) %STARTSWITH %STRING(' od ')
この例では、%STRING を使用して O'Donnell も Odem も選択できます。
ケース変換関数の詳細は、"照合タイプ" を参照してください。
%SelectMode
%STARTSWITH 述語は、現在の %SelectMode 設定を使用できません。substring は、%SelectMode 設定に関係なく、論理形式で指定する必要があります。述語値 (1 つまたは複数) を ODBC 形式または表示形式で指定すると、通常は、データが一致しないか、意図していないデータと一致することになります。このことは主に、日付、時刻、および Caché 形式のリスト (%List) に当てはまります。
以下のダイナミック SQL の例では、%STARTSWITH 述語で、%SelectMode=1 (ODBC) の形式ではなく論理形式で日付の substring を指定する必要があります。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 %STARTSWITH '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"
リスト・フィールド
scalar-expression がリスト・フィールドの場合、%STARTSWITH は %EXTERNAL を使用して、リストの値と substring を比較できます。例えば、FavoriteColors リスト・フィールドが 'Bl' で始まるレコードをすべて判別するには、以下のようにします。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'Bl'
%EXTERNAL によってリストが DISPLAY 形式に変換されると、表示されるリスト項目は、空白スペースで区切られます。この “スペース“ は実際には、CHAR(13) と CHAR(10) という 2 つの非表示文字です。%STARTSWITH をリスト内の複数の要素と共に使用するには、これらの文字を指定する必要があります。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'Orange'||CHAR(13)||CHAR(10)||'B'
NULL の除外
-
scalar-expression が NULL 以外の任意のデータ値で substring が “空” 値の場合、%STARTSWITH は必ず scalar-expression を返します。
-
scalar-expression が NULL で substring が “空” 値の場合、%STARTSWITH は scalar-expression を返しません。
“空” の substring 値とは、NULL、CHAR(0)、空文字列 ('')、空白スペースのみで構成される文字列 (' ')、スペース文字を表す CHAR(32)、およびタブ文字を表す CHAR(9) のいずれかです。既定では、%STARTSWITH は NULL の除外にこれらすべての値を使用します。
空白スペース文字のみで構成される scalar-expression 値を返すには、%EXACT 照合を使用する必要があります。
以下の例では、%STARTSWITH はすべて同じ結果を返します。結果セットは NULL でない FavoriteColors 値に制限されます。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH NULL
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH ''
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH ' '
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH CHAR(9)
リスト・フィールドから NULL を除外する際に、scalar-expression に %EXTERNAL 照合タイプは使用されません。
%STARTSWITH の NULL および空文字列の動作は、複合 substring とは異なります。これは、NULL および空文字列の定義が原因です。値と NULL を連結すると、結果は NULL になります。値と空文字列を連結すると、結果はその値になります。詳細は、以下の例を参照してください。
SELECT Name,FavoriteColors
FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'B'||NULL
/* Selects all non-null rows */
SELECT Name,FavoriteColors
FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'B'||''
/* Selects all values that begin with B */
先頭および末尾の空白
ほとんどの場合、%STARTSWITH は先頭の空白をその他の文字と同様に処理します。例えば、%STARTSWITH ' B' を使用して、先頭の 1 つの空白の後に文字 B が続くフィールド値を選択することができます。ただし、substring が空白のみの場合は、先頭が空白のデータとしては選択されず、NULL 以外の値として選択されます。
末尾の空白に対する %STARTSWITH の動作は、データ型および照合タイプにより異なります。%STARTSWITH では、SQLUPPER として定義されている文字列 substring 内の末尾の空白は無視されます。ただし、数値、日付、またはリストの substring 内の末尾の空白は無視されません。
以下の例では、%STARTSWITH は結果セットを 'M' で始まる名前に制限しています。Name は SQLUPPER 文字列データ型であるため、substring の末尾の空白は無視されます。
SELECT Name FROM Sample.Person
WHERE Name %STARTSWITH 'M '
以下の例では、substring の末尾の空白は数値の場合無視されないため、%STARTSWITH は結果セットからすべての行を削除します。
SELECT Name,Age FROM Sample.Person
WHERE Age %STARTSWITH '6 '
以下の例では、substring の末尾の空白はリスト値の場合無視されないため、%STARTSWITH は結果セットからすべての行を削除します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'Blue '
ただし、以下の例では、結果セットは Blue で始まりリスト区切り (空白として表示されます) が続くリスト値で構成されます。つまり、‘Blue’ で始まり、複数の項目を含むリストになります。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE %EXTERNAL(FavoriteColors) %STARTSWITH 'Blue'||CHAR(13)||CHAR(10)
添え字の範囲
添え字から scalar-expression を取得した場合は、%STARTSWITH をインデックス制限の範囲条件として使用して、検索する必要がある scalar-expression 添え字値の範囲を縮小できます。このロジックは、指定された substring 接頭語値で添え字の範囲を開始し、添え字値が substring で始まらなくなったらすぐに停止するというものです。
言語によってあいまい照合が行われる文字
言語によっては、2 文字または文字の組み合わせは、初回の照合の通過について等価と見なされます。これは一般的に、Czech2 ロケールなどにおける、アクセント符号の付く文字または付かない文字です。そのようなロケールでは、CHAR(65) と CHAR(193) は両方とも、“A” として照合されます。%STARTSWITH は、これらの文字を等価と認識します。
以下の例では、照合における初回通過時の Czech2 CHAR(65) (A) と CHAR(193) (Á) を示します。
M MA MÁ MAC MÁC MACX MÁCX MAD MÁD MB
どの国固有照合が実行時に使用されるかをクエリのコンパイル時に把握できないという点に注意する必要があります。したがって、実行時に起こり得る状況に適切に対応するよう、%STARTSWITH 添え字検索コードを記述する必要があります。
その他の等値比較
%STARTSWITH は、文字列の先頭文字 (列) の等値比較を行います。文字列比較演算子を使用して、その他のタイプの等値比較を実行できます。これは、以下の項目が含まれます。
-
等記号を使用した文字列全体の等値比較。
SELECT Name,Home_State FROM Sample.Person WHERE Home_State = 'VT'
この例では、Home_State フィールドの値が “VT” のレコードが選択されます。Home_State が SQLUPPER として定義されているため、この文字列比較では大文字と小文字は区別されません。
-
不等記号を使用した文字列全体の不等値比較。
SELECT Name,Home_State FROM Sample.Person WHERE Home_State <> 'MA' ORDER BY Home_State
この例では、Home_State フィールドの値が “MA” と等しくないレコードがすべて選択されます。
-
IN キーワード演算子を使用した、文字列全体の複数の値との等値比較。
SELECT Name,Home_State FROM Sample.Person WHERE Home_State IN ('VT','MA','NH','ME') ORDER BY Home_State
この例では、指定された Home_State フィールドのいずれかの値をとるレコードがすべて選択されます。
-
%PATTERN キーワード演算子を使用した、文字列全体の値のパターンとの等値比較。
SELECT Name,Home_State FROM Sample.Person WHERE Home_State %PATTERN '1U1"C"' ORDER BY Home_State
この例では、1U (大文字 1 文字) の後に 1"C" (“C” の 1 文字) が続くパターンと一致する Home_State フィールドの値を含むすべてのレコードが選択されます。このパターンは、Home_State の省略形が “NC” や “SC” などの場合、満たされます。
-
包含関係演算子を使用した、部分文字列と値との等値比較。
SELECT Name FROM Sample.Person WHERE Name [ 'y'
この例では、小文字の “y” が含まれる Name フィールドのレコードがすべて選択されます。既定では、大文字と小文字を区別しないようにフィールドが定義されている場合でも、包含関係演算子の比較で大文字と小文字が区別されます。
-
%CONTAINS または %CONTAINSTERM 比較演算子を使用した、1 つ以上の部分文字列と値との単語認識等値比較。これらの演算子は、%Text プロパティで再定義された文字列にのみ使用できます。
-
LIKE キーワード演算子を使用した、1 つ以上のワイルドカードを含む部分文字列と値との等値比較。
SELECT Name FROM Sample.Person WHERE Name LIKE '_a%'
この例では、2 文字目に “a” が含まれる Name フィールドのレコードがすべて選択されます。この文字列比較では、Name 照合タイプによって、比較で大文字と小文字が区別されるかどうかが決定されます。
これらの詳細とその他の比較条件の述語については、"WHERE" 節を参照してください。
例
以下の例では、WHERE 節を使用して “R” または “r” の文字から始まる Name の値を選択します。既定では、%STARTSWITH の文字列比較は大文字と小文字が区別されません。
SELECT Name FROM Sample.Person
WHERE Name %STARTSWITH 'r'
以下の例は、“M” で始まる Home_State の名前ごとにレコードを 1 件返します。
SELECT DISTINCT Home_State FROM Sample.Person
WHERE Home_State %STARTSWITH 'M'
ORDER BY Home_State
以下の例は、HAVING 節を使用して年齢が 2 で始まる人のレコードを選択して、全員の年齢の平均と HAVING 節で選択された人の年齢の平均を表示します。結果は年齢順に並べ替えられます。
SELECT Name,
Age,
AVG(Age) AS AvgAge,
AVG(Age %AFTERHAVING) AS Avg20
FROM Sample.Person
HAVING Age %STARTSWITH 2
ORDER BY Age
以下の例は、DOB (誕生日) フィールドの内部日付の形式値で %STARTSWITH 比較を実行します。この場合、11/5/1988 ($H=54000) ~ 08/1/1991 ($H=54999) のすべての日付を選択します。
SELECT Name,DOB
FROM Sample.Person
WHERE DOB %STARTSWITH 54
ORDER BY DOB