Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

%STARTSWITH (SQL)

最初の文字を指定する部分文字列と値をマッチングします。

Synopsis

column %STARTSWITH substring

概要

  • column %STARTSWITH substring は、substring で指定された文字で始まる列からデータ値を選択します。substring がいずれの列値とも一致しない場合、%STARTSWITH は NULL 文字列を返します。%STARTSWITH は、設定されている表示モードに関係なく、この照合を列の論理内部保存値に対して実行します。

    %STARTSWITH は、InterSystems SQL クエリの任意の述語条件で使用できます。述語条件の詳細は、"述語の概要" を参照してください。

    以下の文は、M の文字で始まる名前をすべて選択します。

    SELECT Name FROM Sample.MyTest WHERE Name %STARTSWITH 'M'

    値を照合するその他の方法については、"その他の等値比較" を参照してください。

    例 :

引数

column

substring と比較される値が含まれる、テーブル内のデータ列。この引数には、%EXTERNAL(column)%SQLUPPER(column) など、列テーブルに評価されるスカラ式を指定することもできます。

substring

column に指定した値と照合する 1 つまたは複数の先頭文字。この引数には、文字列または数値に解決される式を指定する必要があります。

最初の文字に基づいた列データの選択

%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 では、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)

論理演算子を使用した列データの選択

%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 が空の値の場合、%STARTSWITHcolumn からデータを返しません。

空白文字のみで構成される 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 が含まれるテーブルがあるとします。%STARTSWITHcolumn 引数内の 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')

照合の既定値の変更、または大文字小文字の変換関数の使用の詳細は、"照合" を参照してください。

詳細

添え字の範囲

添え字から column を取得した場合は、%STARTSWITH をインデックス制限の範囲条件として使用して、検索する必要がある column 添え字値の範囲を縮小できます。このロジックは、指定された substring 接頭語値で添え字の範囲を開始し、添え字値が substring で始まらなくなったらすぐに停止するというものです。

その他の等値比較

%STARTSWITH は、文字列の先頭文字の等値比較を行います。文字列比較演算子を使用して、その他のタイプの等値比較を実行できます。これは、以下の項目が含まれます。

  • 等記号を使用した文字列全体の等値比較。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State = 'VT'

    この例では、Home_State フィールドの値が “VT” のレコードが選択されます。Home_State が SQLUPPER として定義されているため、この文字列比較では大文字と小文字は区別されません。

    不等記号 (<>) を使用した文字列全体の不等値比較を実行することもできます。

  • 包含関係演算子を使用した、部分文字列と値との等値比較。

    SELECT Name FROM Sample.Person
    WHERE Name [ 'y'

    この例では、小文字の “y” が含まれる Name フィールドのレコードがすべて選択されます。既定では、大文字と小文字を区別しないようにフィールドが定義されている場合でも、包含関係演算子の比較で大文字と小文字が区別されます。

  • InterSystems SQL Search を使用したコンテキスト認識等値比較。SQL Search の用途の 1 つは、指定された単語や語句が値に含まれているかどうかを判断することです。SQL Search では大文字と小文字が区別されません。

  • IN キーワード演算子を使用した、文字列全体の複数の値との等値比較。例えば、以下の文は、指定された Home_State フィールドのいずれかの値が含まれるレコードをすべて選択します。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State IN ('VT','MA','NH','ME')
    ORDER BY 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" がこのパターンを満たします。

  • LIKE キーワード演算子を使用した、1 つ以上のワイルドカードを含む部分文字列と値との等値比較。

    SELECT Name FROM Sample.Person
    WHERE Name LIKE '_a%'

    この例では、2 文字目に “a” が含まれる Name フィールドのレコードがすべて選択されます。この文字列比較では、Name 照合タイプを使用して、比較で大文字と小文字が区別されるかどうかが指定されます。

これらの詳細とその他の比較条件の述語については、"WHERE" 節を参照してください。

%SelectMode 設定

%STARTSWITH 述語は、現在の %SelectMode 設定を使用できません。substring は、%SelectMode 設定に関係なく、論理形式で指定する必要があります。述語値 (1 つまたは複数) を ODBC 形式または表示形式で指定すると、通常は、データが一致しないか、意図していないデータと一致することになります。このことは主に、日付、時刻、および InterSystems IRIS 形式のリスト (%List) に当てはまります。

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

  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"

言語によってあいまい照合が行われる文字

言語によっては、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 添え字検索コードを記述する必要があります。

関連項目

FeedbackOpens in a new tab