最初の文字に基づいた列データの選択
%STARTSWITH 述語では、さまざまな文字列型および数値型を処理できます。
文字
以下の文は、M の文字から始まる個別の Home_State 名ごとに 1 行を返します。
SELECT DISTINCT Home_State FROM Sample.Person
WHERE Home_State %STARTSWITH 'M'
ORDER BY Home_State
既定の照合設定では、%STARTSWITH のマッチングで大文字と小文字は区別されません。このため、この文は "M" または "m" で始まる名前に一致します。マッチングで大文字/小文字の区別を制御する方法の詳細は、"照合タイプに基づいた選択の大文字/小文字の区別の管理" を参照してください。
数値
以下の文は、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
リスト
column にリスト・コレクションが含まれている場合、%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'
column に %Libary.List 型のデータが含まれている場合、%Libary.List データは LOGICAL 形式で格納されており、別個の DISPLAY 形式はないため、%EXTERNAL を使用する必要はありません。リスト・データを照合するには、$LIST 関数を使用します。以下に例を示します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH $LISTFROMSTRING('Yellow,Orange')
Note:
InterSystems SQL では、リストを連結文字列として格納しているため、%STARTSWITH を使用してリストの途中にある要素を照合することはできません。%STARTSWITH は、リストの先頭からのみ照合できます。これは、リスト・コレクションと %Libary.List データの両方に適用されます。
先頭および末尾の空白
ほとんどの場合、%STARTSWITH は先頭の空白をその他の文字と同様に処理します。例えば、%STARTSWITH ' B' は、先頭の 1 つの空白の後に文字 B が続く列値を選択します。ただし、substring に空白のみが含まれる場合は、NULL 以外の値が選択され、先頭の空白は選択されません。
末尾の空白に対する %STARTSWITH の動作は、データ型および照合タイプにより異なります。
以下の文では、%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)
論理演算子を使用した列データの選択
%STARTSWITH 関数は、論理演算子 NOT、AND、および OR をサポートします。
以下の文は、M 以外の文字で始まる名前をすべて選択します。
SELECT Name FROM Sample.MyTest WHERE NOT Name %STARTSWITH 'M'
以下の文は、M または N で始まる名前をすべて選択します。
SELECT Name FROM Sample.MyTest WHERE Name %STARTSWITH 'M' OR Name %STARTSWITH 'N'
以下の文は、名が M で始まり、姓が N で始まる名前をすべて選択します。
SELECT FirstName,LastName FROM Sample.MyTest WHERE FirstName %STARTSWITH 'M' AND LastName %STARTSWITH 'N'
フィルタでの NULL 値の除外
%STARTSWITH 関数では、column が NULL 以外のデータ値に評価され、substring が空の値の場合、%STARTSWITH は NULL 以外の column データを返します。この動作を利用して、NULL 以外の値をフィルタで除外できます。例えば、以下の文は、結果セットを FavoriteColors 列内の NULL 以外の値に制限します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors %STARTSWITH NULL
空の substring とは、値が以下のいずれかの場合を言います。
-
NULL
-
CHAR(0)
-
空の文字列 ('')
-
1 つの空白のみが含まれる文字列 (' ')
-
CHAR(32) (空白文字)
-
CHAR(9) (タブ文字)
以下の文は、前の文と同じ結果を返します。
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)
column が NULL に評価され、substring が空の値の場合、%STARTSWITH は column からデータを返しません。
空白文字のみで構成される column 値を返すには、%EXACT 照合を使用する必要があります。リスト・フィールドから NULL を除外する際に、column に %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 はマッチングの対象となるフィールドと同じ照合を使用します。文字列データ型のフィールドは、大文字と小文字を区別しない SQLUPPER 照合で定義されるため、既定の %STARTSWITH 選択でも大文字と小文字は区別されません。例えば、以下の文は、"M" または "m" で始まる自宅の州に一致します。
SELECT DISTINCT Home_State FROM Sample.Person
WHERE Home_State %STARTSWITH 'M'
ORDER BY Home_State
異なる照合タイプを WHERE 節の列に割り当てると、この照合タイプで %STARTSWITH substring のリテラル値がマッチングされます。例えば、EXACT (大文字と小文字を区別する) 照合を使用するよう検索列 Home_State を指定すると、%STARTSWITH は、"M" で始まる自宅の州のみにマッチングします。
SELECT DISTINCT Home_State FROM Sample.Person
WHERE %EXACT(Home_State) %STARTSWITH 'M'
ORDER BY Home_State
一部の照合関数は、フィールド値の先頭に空白文字を追加します。これにより、同等の照合関数を部分文字列に適用する場合を除いて、%STARTSWITH で値がマッチングされない可能性があります。
例えば、EXACT 照合を使用する列 ExactName が含まれるテーブルがあるとします。%STARTSWITH の column 引数内の ExactName に SQLUPPER 照合を適用すると、%STARTSWITH は、空白文字で始まる値が含まれる列を検索します。したがって、以下のような比較は行を返しません。
SELECT ExactName FROM Sample.MyTest WHERE %SQLUPPER(ExactName) %STARTSWITH 'Ra'
この問題を解決するには、同じ照合関数を部分文字列に適用するなどの方法で、substring の先頭に空白文字を追加する必要があります。以下の例では、大文字と小文字を区別しないマッチングが EXACT 列に適用されています。
SELECT ExactName FROM Sample.MyTest WHERE %SQLUPPER(ExactName) %STARTSWITH %SQLUPPER('Ra')
照合の既定値の変更、または大文字小文字の変換関数の使用の詳細は、"照合" を参照してください。