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

言語要素

InterSystems SQL は以下の言語要素をサポートします。

コマンドとキーワード

InterSystems SQL コマンド (SQL 文とも呼ばれる) は、キーワードで始まり、1 つ以上の引数が続きます。この引数のいくつかは、固有のキーワードで識別できる節または関数である場合があります。

  • InterSystems SQL コマンドには、コマンド・ターミネータはありません。ただし例外として、SQL プロシージャ・コードトリガ・コードなどの特定のケースでは、SQL コマンドは単一のセミコロン (;) で終了します。それ以外の場合、InterSystems SQL コマンドは、セミコロンのコマンド・ターミネータを必要としないかまたは受け入れません。InterSystems SQL でセミコロンのコマンド・ターミネータを指定すると、SQLCODE -25 エラーになります。InterSystems IRIS® データ・プラットフォームにおける TSQL (Transact-SQL) の実装では、セミコロンのコマンド・ターミネータを受け付けますが、必須ではありません。SQL コードを InterSystems SQL にインポートすると、セミコロンのコマンド・ターミネータは削除されます。

  • InterSystems SQL コマンドには、空白の制約はありません。コマンド項目をスペースで区切る場合、少なくとも 1 つのスペースが必要です。コマンド項目をコンマで区切る場合、スペースは不要です。算術演算子の前後のスペースは不要です。スペースで区切られた項目間、引数のコンマ区切りリストの項目間、あるいは算術演算子の前後には、改行または複数のスペースを挿入してもかまいません。

InterSystems SQL のキーワードには、コマンド名、関数名、述語条件名、データ型名、フィールド制約、最適化オプション、および特殊変数などがあります。また、AND、OR、および NOT 論理演算子、NULL 列値インジケータ、および ODBC 関数構文 ({d dateval} および {fn CONCAT(str1,str2)} など) があります。

  • キーワードでは、大文字と小文字は区別されません。慣例により、キーワードはこのドキュメントでは大文字で表されますが、InterSystems SQL には大文字/小文字の制限はありません。

  • 多数のキーワードが SQL 予約語となっています (すべてではありません)。InterSystems SQL では、明確に解析できないキーワードのみが予約されています。SQL 予約語は、区切り識別子として使用できます。

関数 : 内部および外部

関数は演算を実行し、値を返します。一般に、InterSystems SQL では、関数は SELECT 文で select-item として指定されるか、WHERE 節で指定され、テーブルのフィールド値またはリテラル値に対して演算を実行します。

  • 内部 : InterSystems SQL では、多数の内部 (システム提供) 関数をサポートしています。これには、数値関数、文字列関数、日時関数などが含まれます。これらの関数については、"InterSystems SQL リファレンス" を参照してください。この章では、算術関数と三角関数についても説明します。

    集約関数は、列のすべての値を評価し、単一の集約値を返す SQL 内部関数です。集約関数は、"InterSystems SQL リファレンス" で個別に説明されています。

  • 外部 : InterSystems SQL では、以下の例に示すように、ユーザ指定の ObjectScript 関数呼び出し (外部関数) もサポートしています。

    MySQL
      &sql(SELECT Name,$$MyFunc() INTO :n,:f FROM Sample.Person)
        IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg  QUIT}
        ELSEIF SQLCODE=100 {WRITE "Query returns no results"  QUIT}
      WRITE "name is: ",n,!
      WRITE "function value is: ",f,!
      QUIT
    MyFunc()
      SET x="my text"
      QUIT x

    ユーザ指定の (外部) 関数の使用がシステム全体のオプションとして構成されている場合、SQL 文はユーザ指定の (外部) 関数のみ呼び出すことができます。既定値は “いいえ” です。既定では、ユーザ指定関数を呼び出そうとすると、SQLCODE -372 エラーが発生します。SQL による外部関数の使用をシステム全体で構成するには、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを SET status=$SYSTEM.SQL.Util.SetOption("AllowExtrinsicFunctions",1,.oldval) のように使用します。現在の設定を確認するには $SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[SQL文で外部関数の使用を許可] オプションが表示されます。

    ユーザ指定関数を使用して、% ルーチン (% 文字で始まる名前を持つルーチン) を呼び出すことはできません。実行しようとすると SQLCODE -373 エラーが発行されます。

リテラル

InterSystems SQL リテラルの構文は、以下のとおりです。

literal ::=       number | string-literal  number ::=        {digit}[.]digit{digit}[E[+|-]digit{digit}]   digit ::=      0..9  string-literal ::=       std-string-literal | ObjectScript-empty-string  std-string-literal ::=       ' {std-character-representation} '  std-character-representation ::=      nonquote-character | quote-symbol  quote-symbol ::=       ''  ObjectScript-empty-string ::=       ""

リテラルは、実際の値を表す文字列です。数値または文字列のいずれかになります。

  • 数値は、区切り文字を必要としません。0 ~ 9 の数字、小数点文字、指数記号、正符号、負符号で構成できます。1 つの数値には 1 つの小数点文字しか使用できません。小数点文字は、数値の基数部分にのみ使用でき、指数部分には使用できません。小数点の後に数字を続ける必要はありません。先頭および末尾のゼロは使用可能です。指数 (科学的記数法) の記号は文字 E です。大文字と小文字のどちらの E も使用可能ですが、大文字の E の使用が優先されます。正符号あるいは負符号を、基数または指数の前に置くことができます。また、複数の正符号および負符号を、基数の前に置くことができます。SQL は、これらの符号を演算子として扱います。単一の正符号および負符号のみを指数の前に置くことができます。SQL は、この符号をリテラルの一部として扱います。コンマまたは空白は、数値内で使用できません。

  • 文字列リテラルは、あらゆる種類の文字の文字列を囲む 1 組みの区切り文字で構成されます。優先的に使用される区切り文字は、一重引用符 (以下を参照) です。文字列内で区切り文字をリテラルとして指定するには、'Mary''s office' のように、その文字を重複して使用します。

空文字列はリテラル文字列です。2 つの一重引用符 ('') で表されます。NULL はリテラル値ではありません。値が存在しないことを表します。詳細は、この章の "NULL および空文字列" を参照してください。

Note:

埋め込み SQL では、## で始まるいくつかの文字シーケンスは、文字列リテラル内での使用が許可されません。これについては、“埋め込み SQL の使用法” の章の "リテラル値" で説明しています。この制約は、ダイナミック SQL などの、他の SQL の呼び出しには適用されません。

文字列の区切り文字

文字列の区切り文字としては、一重引用符 (') 文字を使用します。二重引用符文字 (") の使用は、SQL 互換性に対してはサポートされますが、区切り識別子の標準と競合するため、使用しないことを強くお勧めします。二重引用符文字のペア "" は無効な区切り識別子として解析され、SQLCODE -1 エラーを生成します。

文字列内のリテラル文字として一重引用符文字を指定するには、これらの文字のペアをリテラル・エスケープ・シーケンスとして指定します。例えば、'a ''normal'' string' と指定します。

連結

二重の垂直バー (||) は、好ましい SQL 連結演算子です。2 つの数値、2 つの文字列、または 1 つの数値と 1 つの文字列を連結するために使用できます。

アンダースコア文字 (_) は、ObjectScript の互換性のために SQL 連結演算子として指定されます。連結演算子は、2 つの文字列を連結するためにのみ使用できます。

2 つの演算子が両方とも文字列であり、両方の文字列の照合タイプが同じ場合、結果として得られる連結文字列には、その照合タイプが含まれます。その他の場合はいずれも、連結の結果の照合タイプは EXACT です。

NULL および空文字列

値を指定しないことを示すには、NULL キーワードを使用します。NULL は、何らかの理由でデータ値が指定されていないか存在しないことを示す、SQL で常に推奨されている方法です。

長さゼロの SQL 文字列 (空文字列) は、2 つの一重引用符で指定します。空文字列 ('') は NULL と同じではありません

Note:

長さがゼロの SQL 文字列をフィールドの入力値またはフィールドの既定値とすることはお勧めできません。ObjectScript では、このような文字列が、$CHAR(0) 文字列を使用した長さ 1 の文字列として扱われます。データ値がないことを表すには NULL を使用します。これは、ObjectScript で空文字列 ("") に相当します。詳細は、"ObjectScript と SQL" を参照してください。

長さゼロの SQL 文字列は、SQL コーディングでは使用しないでください。ただし、多くの SQL 処理では末尾の空白スペースが削除されるため、空白文字 (スペースおよびタブ) のみを含むデータ値が、長さゼロの SQL 文字列となる場合があります。

さまざまな SQL 長さ関数がそれぞれ異なる値を返すことに注意してください。LENGTHCHAR_LENGTH、および DATALENGTH は、SQL の長さを返します。$LENGTH は、ObjectScript 表現での長さを返します。後述の “NULL の長さ” を参照してください。LENGTH は末尾の空白スペースを数えません。他のすべての長さ関数は、末尾の空白スペースを数えます。

NULL の処理

NOT NULL データ制約は、1 つのフィールドが 1 つのデータ値を取得することを必要とします。値ではなく NULL を指定することはできません。この制約は、空文字列値の使用を妨げません。詳細は、"CREATE TABLE" コマンドを参照してください。

SELECT 文の WHERE 節または HAVING 節内の IS NULL 述語は、NULL 値を選択します。空文字列値は選択しません。

IFNULL 関数は、フィールド値を評価して、フィールドが NULL に評価された場合は 2 つ目の引数に指定されている値を返します。この関数が、空文字列の値を NULL 以外の値として扱うことはありません。

COALESCE 関数は、指定されたデータから最初の NULL でない値を選択します。空文字列は、NULL でない値として処理されます。

CONCAT 関数または連結演算子 (||) が 1 つの文字列と 1 つの NULL を連結すると、結果は NULL になります。詳細は、以下の例を参照してください。

SELECT {fn CONCAT('fred',NULL)} AS FuncCat,   -- returns <null>
       'fred'||NULL AS OpCat                  -- returns <null>

AVGCOUNTMAXMIN、および SUM 集約関数は、処理を実行するときに NULL 値を無視します (すべてのフィールドに NULL 値 を持つレコードは存在できないため、COUNT * はすべての行をカウントします)。SELECT 文の DISTINCT キーワードは、その処理に NULL を含みます。指定したフィールドに NULL 値が存在する場合、DISTINCT は NULL 行を返します。

AVGCOUNT、および MIN 集約関数は、空文字列値の影響を受けます。MIN 関数は、ゼロ値を持つ行がある場合でも、空文字列を最小値と判断します。MAX および SUM 集約関数は、空文字列値の影響を受けません。

式内の NULL

ほとんどの SQL 関数で NULL をオペランドとして指定すると、NULL が返されます。

NULL をオペランドとして持つ任意の SQL 算術演算は、NULL 値を返します。したがって、7+NULL=NULL となります。これには、二項演算子の加算 (+)、減算 (-)、乗算 (*)、除算 (/)、整数除算 (\)、モジュロ (#)、および単項演算子符号のプラス (+) およびマイナス (-) が含まれます。

算術演算で指定された空文字列は、0 (ゼロ) 値として処理されます。6/'' など、空の文字列による除算 (/)、整数除算 (\)、またはモジュロ (#) では、<DIVIDE> エラーが返されます。

NULL の長さ

SQL 内では、NULL の長さは未定義です (<null> を返します)。しかし、空文字列の長さは、長さゼロとして定義されています。詳細は、以下の例を参照してください。

SELECT LENGTH(NULL) AS NullLen,   -- returns <null>
       LENGTH('') AS EmpStrLen    -- returns 0

この例で示すように、SQL LENGTH 関数は SQL の長さを返します。

以下の例に示すように、ASCII 関数を使用して、長さゼロの SQL 文字列を NULL に変換できます。

SELECT LENGTH(NULL) AS NullLen,                  -- returns <null> 
       LENGTH({fn ASCII('')}) AS AsciiEmpStrLen, -- returns <null>
       LENGTH('') AS EmpStrLen                   -- returns 0

ただし、標準 SQL に対する特定の InterSystems IRIS の拡張は、NULL と空文字列のそれぞれの長さを処理します。$LENGTH 関数は、これらの値の InterSystems IRIS 内部表現を返します。NULL は、長さゼロの定義済みの値として表され、SQL の空文字列は、長さゼロの文字列として表されます。この機能は、ObjectScript と互換性があります。

SELECT $LENGTH(NULL) AS NullLen,    -- returns 0
$LENGTH('') AS EmpStrLen,           -- returns 0
$LENGTH('a') AS OneCharStrLen,      -- returns 1
$LENGTH(CHAR(0)) AS CharZero        -- returns 0 

これらの値の内部表現が有効な別の場所は、%STRING%SQLSTRING、および %SQLUPPER 関数内です。これらの関数は、空白スペースを値に追加します。NULL は実際には値を持たないため、それに空白を追加すると、長さが 1 の文字列が作成されます。一方、空文字列は文字値を持つため、それに空白を追加すると、長さが 2 の文字列が作成されます。以下の例を参照してください。

SELECT CHAR_LENGTH(%STRING(NULL)) AS NullLen,  -- returns 1
CHAR_LENGTH(%STRING('')) AS EmpStrLen          -- returns 2

この例では、LENGTH ではなく CHAR_LENGTH が使用されることに注意してください。LENGTH 関数は末尾の空白を削除するため、LENGTH(%STRING(NULL)) は長さ 0 を返します。LENGTH(%STRING('')) は、%STRING が末尾の空白ではなく先頭の空白を付加するため、長さ 2 を返します。

ObjectScript と SQL

SQL の NULL が ObjectScript に出力された場合、その SQL の NULL は、ObjectScript の空文字列 ("")、つまり長さゼロの文字列で表されます。

長さゼロの SQL 文字列データが ObjectScript に出力された場合、そのデータは、長さ 1 の文字列である $CHAR(0) を含む文字列で表されます。

   &sql(SELECT NULL,''
        INTO :a,:b)

  WRITE !,"NULL length: ",$LENGTH(a)         // returns 0
  WRITE !,"empty string length: ",$LENGTH(b) // returns 1

ObjectScript では、通常、値が存在しないことを空文字列 ("") で示します。この値が埋め込み SQL に渡された場合は、以下の例に示すように、NULL 値として処理されます。

  set x=""
  set myquery="SELECT NULL As NoVal,:x As EmpStr"
  set tStatement=##class(%SQL.Statement).%New()
  
  set qStatus = tStatement.%Prepare(myquery)
  if $$$ISERR(qStatus) {write "%Prepare failed:" do $System.Status.DisplayError(qStatus) quit}
  
  set rset = tStatement.%Execute()
  if (rset.%SQLCODE '= 0) {write "%Execute failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  while rset.%Next()
  {
    write "NoVal:",rset.%Get("NoVal")," length ",$LENGTH(rset.%Get("NoVal")),! // length 0
    write "EmpStr:",rset.%Get("EmpStr")," length ",$LENGTH(rset.%Get("EmpStr")),! // length 0
  }
  if (rset.%SQLCODE < 0) {write "%Next failed:", !, "SQLCODE ", rset.%SQLCODE, ": ", rset.%Message quit}

  write "End of data"

定義されていない入力ホスト変数を指定した場合、埋め込み SQL はその値を NULL として処理します。

以下の例では、空白を追加された SQL 空文字列は、文字列長 2 として渡されます。

   &sql(SELECT %SQLUPPER('')
        INTO :y )
  WRITE !,"SQL empty string length: ",$LENGTH(y)

算術演算子と算術関数

InterSystems SQL は以下の算術演算子をサポートします。

演算子 説明
+ 加算演算子。例えば、17+7 は 24 に等しくなります。
減算演算子。例えば、17-7 は 10 に等しくなります。これらの文字のペアは、InterSystems SQL コメント文字であることに注意してください。このため、複数の減算演算子つまりマイナス記号を指定するには、スペースまたは括弧を使用する必要があります。例えば、17- -7 または 17-(-7) は 24 と等しくなります。
* 乗算演算子。例えば、17*7 は 119 に等しくなります。
/ 除算演算子。例えば、17/7 は 2.428571428571428571 に等しくなります。
\ 整数除算演算子。例えば、17\7 は 2 に等しくなります。
# モジュロ演算子。例えば、17 # 7 は 3 に等しくなります。# 文字は有効な識別子文字でもあるため、これをモジュロ演算子として使用するには、前後にスペースを入れ、オペランドと区切って指定する必要があります。
E 指数 (科学的記数法) 演算子。大文字小文字のいずれでも使用できます。例えば、7E3 は 7000 に等しくなります。指数が大きすぎると、SQLCODE -7 “指数が範囲外です” というエラーが発生します。例えば、1E3097E308 の場合などです。
() グループ化演算子。算術演算子の入れ子に使用します。演算子は ANSI 演算子の優先順位に従って実行されます。例えば、17+7*2 は 31 ですが、(17+7)*2 は 48 となります。
|| 結合演算子。例えば、17||7 は 177 に等しくなります。

算術演算は、キャノニック形式の数字に対して実行されます。

結果のデータ型

データ型が異なる 2 つの数値に対して算術演算を実行した場合、結果のデータ型は以下のように決定されます。

加算 (+)、減算 (-)、整数除算 (\)、およびモジュロ (#) の場合 :

データ型 NUMERIC INTEGER TINYINT SMALLINT BIGINT DOUBLE
NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
INTEGER NUMERIC BIGINT BIGINT BIGINT BIGINT DOUBLE
TINYINT NUMERIC BIGINT SMALLINT INTEGER BIGINT DOUBLE
SMALLINT NUMERIC BIGINT INTEGER INTEGER BIGINT DOUBLE
BIGINT NUMERIC BIGINT BIGINT BIGINT BIGINT DOUBLE
DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE

乗算 (*) または除算 (/) の場合 :

データ型 NUMERIC INTEGER TINYINT SMALLINT BIGINT DOUBLE
NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
INTEGER NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
TINYINT NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
SMALLINT NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
BIGINT NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC DOUBLE
DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE DOUBLE

任意のデータ型の 2 つの数値を連結すると、VARCHAR 文字列になります。

ダイナミック SQL では、SQL 列のメタデータを使用して、結果セット・フィールドのデータ型を確認できます。数値データ型の詳細は、SQL データ型を参照してください。

演算子の優先順位

SQL-92 標準は演算子の優先順位に関して不正確です。このことについての前提は SQL 実装間で異なります。InterSystems SQL は、以下のいずれかのタイプの優先順位をサポートするよう構成できます。

  • InterSystems IRIS 2019.1 以降の場合、InterSystems SQL では、既定で算術演算子の ANSI 優先順位がサポートされます。これは、システム全体の構成設定です。ANSI の優先順位を構成した場合、演算子 "*"、"\"、"/"、および "#" は、演算子 "+"、"-"、および "||" よりも優先順位が高くなります。優先順位の高い演算子は、優先順位の低い演算子より先に実行されます。したがって 3+3*5 は 18 になります。この優先順位は、必要に応じて括弧を使用することでオーバーライドできます。したがって (3+3)*5 は 30 になります。

    既定の ANSI 優先順位は、InterSystems IRIS 2019.1 のクリーン・インストールの場合にサポートされます。InterSystems IRIS 2018.1 を InterSystems IRIS 2019.1 にアップグレードした場合は、演算子の優先順位はそのまま InterSystems IRIS 2018.1 の既定である厳密な左から右の順序に構成されます。

  • InterSystems IRIS 2018.1 の場合、InterSystems SQL では、既定で算術演算子に優先順位はありません。既定では、InterSystems SQL には演算子の優先順位はなく、算術式は必ず左から右の順番で実行されます。これは、ObjectScript で使用される規則と同じです。したがって 3+3*5 は 30 になります。演算順位を指定するには、括弧を使用します。したがって 3+(3*5) は 18 に等しくなります。開発者は、注意深く括弧を使用して、意図を明示する必要があります。

$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを次のように使用して、システム全体でどちらのタイプの SQL 演算子の優先順位も構成できます。SET status=$SYSTEM.SQL.Util.SetOption("ANSIPrecedence",1,.oldval) は、ANSI の優先順位を設定し、SET status=$SYSTEM.SQL.Util.SetOption("ANSIPrecedence",0,.oldval) は、厳密な左から右への評価を設定します。現在の設定を確認するには $SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[ANSI の演算子優先順位を適用する] オプションが表示されます。この SQL オプションの変更内容は、すぐにシステム全体で有効になります。このオプションを変更すると、すべてのクエリ・キャッシュがシステム全体で削除されます。

SQL の優先順位を変更しても、ObjectScript には影響しません。ObjectScript は常に、厳密に左から右へ算術演算子を実行します。

精度と小数桁数

NUMERIC 結果の 精度 (数値内の最大桁数) は、以下のようになります。

  • 加算または減算は、resultprecision=max(scale1, scale2) + max(precision1–scale1, precision2–scale2)+1 というアルゴリズムによって決定されます。計算値 resultprecision が 36 より大きい場合、有効桁数の値は 36 に設定されます。

  • 乗算は、resultprecision=min(36, precision1+precision2+1) というアルゴリズムによって決定されます。

  • 除算 (value1 / value2) は、resultprecision=min(36, precision1–scale1+scale2+max(6, scale1+precision2+1)) というアルゴリズムによって決定されます。

NUMERIC 結果の スケール (小数部の最大桁数) は、以下のようになります。

  • 加算または減算は、resultscale=max(scale1, scale2) というアルゴリズムによって決定されます。

  • 乗算は、resultscale=min(17, scale1+scale2) というアルゴリズムによって決定されます。

  • 除算 (value1 / value2) は、resultscale=min(17, max(6, scale1+precision2+1)) というアルゴリズムによって決定されます。

データ型、有効桁数、および小数桁数の詳細は、SQL の "データ型" を参照してください。

算術関数と三角関数

InterSystems SQL は以下の算術関数をサポートします。

関数 説明
ABS 数値式の絶対値を返します。
CEILING 数値式以上の最も近い整数が返されます。
EXP 数値式の Log 指数値 (基数 e) の値を返します。
FLOOR 数値式以下の最大の整数が返されます。
GREATEST コンマ区切りの数値のリストから最大の数値を返します。
ISNUMERIC 式が有効な数値かどうかを示すブーリアン値コードを返します。
LEAST コンマ区切りの数値のリストから最小の数値を返します。
LOG 数値式の自然対数 (基数 e) 値を返します。
LOG10 数値式の基底 10 の対数値を返します。
MOD 除算演算の剰余値を返します。# 演算子と同じです。
PI 数値定数 pi を返します。
POWER 数値式の指定した累乗の値を返します。
ROUND 指定した桁数に丸めた (または切り捨てた) 数値式を返します。
SIGN 数値式の値が正、ゼロ、または負のいずれになるかを示す数値コードを返します。
SQRT 数値式の平方根の値を返します。
SQUARE 数値式の 2 乗の値を返します。
TRUNCATE 指定された桁数に切り捨てた数値式を返します。

InterSystems SQL は以下の三角関数をサポートします。

関数 説明
ACOS 数値式のアークコサインを返します。
ASIN 数値式のアークサインを返します。
ATAN 数値式のアークタンジェントを返します。
COS 数値式のコサインを返します。
COT 数値式のコタンジェントを返します。
SIN 数値式のサインを返します。
TAN 数値式のタンジェントを返します。

InterSystems SQL は以下の角度変換関数もサポートします。

関数 説明
DEGREES ラジアンを角度に変換します。
RADIANS 角度をラジアンに変換します。

関係演算子

条件式からブーリアン値が求められます。条件式では以下の関係演算子を使用できます。

演算子 説明
= 等値演算子

!=

<>

不等値演算子。2 つの構文形式は機能的に同じです。
< より小さい演算子
> より大きい演算子
<= 以下演算子
>= 以上演算子

これらの等値演算子は、テーブルのフィールド値を比較するときにはフィールドの既定の照合を使用します。InterSystems IRIS の既定では大文字と小文字が区別されません。2 つのリテラルを比較するときには、大文字と小文字が区別されます。

浮動小数点数の比較の際には、等値演算子 (等しい、等しくない) は避ける必要があります。浮動小数点数 (データ型 のクラス %Library.DecimalOpens in a new tab および %Library.DoubleOpens in a new tab) は固定有効桁数ではなく、バイナリ値として格納されます。変換の際に、丸め処理によって 2 つの浮動小数点数となり、正確には等しくない同等の数値となる場合があります。未満であるか、より大きいかのテストを使用して、2 つの浮動小数点数が所定の精度と “同等” であるかどうかを判断してください。

包含関係演算子と後続関係演算子

InterSystems SQL では、Contains 比較演算子と Follows 比較演算子もサポートされています。

演算子 説明
[ 包含関係演算子。オペランドを含んでいる値をすべて返します (オペランドと等しい値が含まれます)。この演算子は、EXACT (大文字と小文字を区別する) 照合を使用します。否定は NOT[ です。
  • 包含関係演算子は、指定された文字または文字列が値に含まれているかどうかを判断します。大文字と小文字が区別されます。

  • %STARTSWITH 述語条件は、指定された文字または文字列で値が始まるかどうかを判断します。大文字と小文字は区別されません。

  • InterSystems SQL Search を使用して、指定された単語や語句が値に含まれているかどうかを判断できます。SQL Search は、コンテキスト認識のマッチングを実行します。大文字と小文字は区別されません。

演算子 説明
] 後続関係演算子。照合シーケンスでオペランドに続く値をすべて返します。オペランドの値自体は除かれます。この演算子は、フィールドの既定の照合を使用します。InterSystems IRIS の既定では大文字と小文字が区別されません。否定は NOT] です。

例えば、SELECT Age FROM MyTable WHERE Age ] 88 は 89 以上を返しますが、9 も返します。9 は照合シーケンスでは 88 の後であるためです。SELECT Age FROM MyTable WHERE Age > 88 は 89 以上を返し、9 は返しません。‘ABC’ などの文字列オペランドは、‘ABCA’ など、追加の文字を含む文字列の前に照合されます。このため、オペランド文字列を ] 演算子または > 演算子から除外するには、文字列全体を指定する必要があります。Name ] ‘Smith,John’ は、‘Smith,John’ を除外しますが、‘Smith,John P’ は除外しません。

論理演算子

SQL 論理演算子は、True または False として評価する条件式で使用されます。これらの条件式は SELECT 文の WHERE 節と HAVING 節、CASE 文の WHERE 節、JOIN 文の ON 節、および CREATE TRIGGER 文の WHEN 節で使用されます。

単項否定演算子

単項否定論理演算子を使用して、論理的に逆の条件を指定します。以下に例を示します。

SELECT Name,Age FROM Sample.Person
WHERE NOT Age>21
ORDER BY Age
SELECT Name,Age FROM Sample.Person
WHERE NOT Name %STARTSWITH('A')
ORDER BY Name

NOT 演算子を条件の前に配置できます (上記のとおり)。または、NOT を単一文字演算子の直前に配置できます。例えば、NOT<NOT[ などです。NOT とそれによって否定する単一文字演算子の間には、スペースを入れてはなりません。

AND 演算子および OR 演算子

一連の複数条件で 2 つのオペランド間に AND 論理演算子および OR 論理演算子を使用できます。これらの論理演算子は、キーワードまたは記号で指定できます。

演算子 説明
AND &
OR !

記号演算子とオペランドの間にスペースは必要ありません (ただし読みやすくするためにスペースを入れることをお勧めします)。キーワード演算子の前後にはスペースが必要です。

これらの論理演算子は、単項否定論理演算子と組み合わせることができます。WHERE Age<65 & NOT Age=21 のように使用します。

以下の 2 つの例では、論理演算子を使用して、年齢に基づいた課税をスケジュールします。年齢が 20 ~ 40 歳の人は 3 年ごとに、40 ~ 64 歳の人は 2 年ごとに、そして 65 歳以上の人は毎年課税します。以下の例では結果が同じになります。最初の例はキーワードを使用し、2 番目の例は記号を使用しています。

SELECT Name,Age FROM Sample.Person
WHERE Age>20
      AND Age<40 AND (Age # 3)=0 
      OR Age>=40 AND (Age # 2)=0 
      OR Age>=65
ORDER BY Age
SELECT Name,Age FROM Sample.Person
WHERE Age>20
      & Age<40 & (Age # 3)=0 
      ! Age>=40 & (Age # 2)=0 
      ! Age>=65
ORDER BY Age

括弧を使用すると論理演算子をグループにできます。これにより、グループ・レベルを設定できます。評価は、最下位のグループから最上位のグループの順で行われます。以下の最初の例では、AND 条件は 2 番目の OR 条件にのみ適用されます。MA からすべての年齢の人物を返し、NY から 25 歳未満の人物を返します。

SELECT Name,Age,Home_State FROM Sample.Person
WHERE Home_State='MA' OR Home_State='NY' AND Age < 25
ORDER BY Age

グループ条件で括弧を使用すると、異なる結果になります。以下の例は、MA または NY から、年齢が 25 歳未満の人物を返します。

SELECT Name,Age,Home_State FROM Sample.Person
WHERE (Home_State='MA' OR Home_State='NY') AND Age < 25
ORDER BY Age
  • SQL の実行は、簡易版のロジックを使用します。条件が偽になると、残りの AND 条件はテストされません。条件が真になると、残りの OR 条件はテストされません。

  • ただし、SQL は、WHERE 節の実行を最適化するため、同じグループ・レベルでの複数条件の実行順序は予測できず、有効ではありません。

コメント

InterSystems SQL は、1 行のコメントと複数行のコメントの両方をサポートします。コメント・テキストには、任意の文字や文字列を含めることができます。ただし当然ながら、コメントの末尾を示す文字は使用できません。

Note:

埋め込み SQL のマーカ構文 (&sql<marker>(...)<reversemarker>) を使用すると、SQL コメントの内容に制約が課されます。マーカ構文を使用する場合には、SQL コード内のコメントに文字シーケンス “)<reversemarker>” は使用できません。詳細は、このドキュメントの “埋め込み SQL の使用法” の章の "&sql 指示文" を参照してください。

preparse()Opens in a new tab メソッドを使用して、コメントを削除した SQL DML 文を返すことができます。さらに、preparse() メソッドは各クエリ引数を ? 文字に置き換えて、これらの引数の %List 構造を返します。以下の例で、preparse() メソッドは、1 行および複数行のコメントと空白が削除された解析バージョンのクエリを返します。

  SET myq=4
  SET myq(1)="SELECT TOP ? Name /* first name */, Age "
  SET myq(2)="   FROM Sample.MyTable -- this is the FROM clause"
  SET myq(3)="   WHERE  /* various conditions "
  SET myq(4)="apply */ Name='Fred' AND Age > 21 -- end of query"
  DO ##class(%SQL.Statement).preparse(.myq,.stripped,.args)
  WRITE stripped,!
  WRITE $LISTTOSTRING(args)

1 行コメント

1 行のコメントを指定するには、行頭に 2 つのハイフンを記述します。コメントは独立した行として記述できるほか、SQL コードと同じ行に記述することもできます。SQL コードの後にコメントを続ける場合は、コードの末尾に空白を 1 つ以上置き、その後にハイフン 2 つのコメント演算子を記述します。コメントには、ハイフン、アスタリスク、スラッシュも含め、あらゆる文字を使用できます。その行の最後までがコメントです。

以下の例では、複数の 1 行コメントが記述されています。

-- This is a simple SQL query
-- containing -- (double hyphen) comments
SELECT TOP 10 Name,Age, -- Two columns selected
Home_State -- A third column
FROM Sample.Person -- Table name
-- Other clauses follow
WHERE Age > 20 AND -- Comment within a clause
Age < 40
ORDER BY Age,  -- Comment within a clause
Home_State
-- End of query

複数行コメント

複数行のコメントを指定するには、/* 開始区切り文字と */ 終了区切り文字を使用します。コメントは、1 行または複数の別々の行として記述することも、SQL コードと同じ行で開始または終了することもできます。少なくとも 1 つの空白を使用して、コメント区切り文字を SQL から区切る必要があります。コメントには、ハイフン、アスタリスク、スラッシュも含め、あらゆる文字を記述できます。ただし、*/ 文字の組み合わせは明らかに例外です。

Note:

構文 /*#OPTIONS */ (/* と # の間にスペースなし) は、コメント・オプションを指定します。コメント・オプションは、コメントではありません。これは、クエリ・オプティマイザが SQL クエリのコンパイル時に使用するコード・オプションを指定します。コメント・オプションは、JSON 構文 (通常は、/*#OPTIONS {"optionName":value} */ などの key:value ペア) を使用して指定します。

以下の例では、複数の複数行コメントが記述されています。

/* This is 
   a simple 
   SQL query. */
SELECT TOP 10 Name,Age /* Two fields selected */
FROM Sample.Person  /* Other clauses 
could appear here */ ORDER BY Age
/* End of query */

埋め込み SQL コードをコメントアウトする場合、必ずコメントを &sql 指示文の前または括弧内で始めます。以下の例では、2 つの埋め込み SQL コード・ブロックが正しくコメントアウトされています。

   SET a="default name",b="default age"
   WRITE "(not) Invoking Embedded SQL",!
   /*&sql(SELECT Name INTO :a FROM Sample.Person) */
   WRITE "The name is ",a,!
   WRITE "Invoking Embedded SQL (as a no-op)",!
   &sql(/* SELECT Age INTO :b FROM Sample.Person */)
   WRITE "The age is ",b

コメントとして保持される SQL コード

埋め込み SQL 文は、ルーチンの .INT コード・バージョンのコメントとして保持することができます。これをシステム全体で行うには、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを SET status=$SYSTEM.SQL.Util.SetOption("RetainSQL",1,.oldval) のように設定します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[.INT コード内で SQL 文をコメントとして残す] の設定が表示されます。既定は 1 (“はい”) です。

このオプションを [はい] に設定すると、ルーチンの .INT コード・バージョンで SQL 文をコメントとして維持できます。また、“はい” に設定することで、コメントのテキストの中でその SQL 文によって使用されている非 % 変数をすべてリストにできます。このリストの変数を ObjectScript プロシージャの PUBLIC 変数リストにもリストし、NEW コマンドで再び初期化する必要があります。詳細は、このドキュメントの “埋め込み SQL” の章の "ホスト変数" を参照してください。

FeedbackOpens in a new tab