メッセージ・セレクター構文

IBM® MQ メッセージ・セレクターは、 SQL92 条件式構文のサブセットに基づく構文を使用したストリングです。

メッセージ・セレクターが評価される順序は、優先順位内で左から右です。 括弧を使用してこの順序を変更できます。 定義済みのセレクター・リテラルおよび演算子名は、大文字でここに書き込まれます。ただし、これらには大/小文字の区別がありません。

IBM MQ は、メッセージ・セレクターが提示された時点で、その構文が正しいかどうかを検証します。 選択ストリングの構文が正しくないか、 プロパティー名が有効でない場合で、かつ拡張メッセージ選択プロバイダーが使用可能でない場合に、 アプリケーションに MQRC_SELECTION_NOT_AVAILABLE が戻されます。 選択ストリングの構文が正しくないか、 プロパティー名が有効でない場合、サブスクリプションが再開されると、 アプリケーションに MQRC_SELECTOR_SYNTAX_ERROR が戻されます。 プロパティーが設定されたときに (MQCMHO_VALIDATE の代わりに MQCMHO_NONE を設定することによって) プロパティー名の妥当性検査が 使用不可に設定されていた場合、その後にアプリケーションが、無効なプロパティー名を使うメッセージを書き込むと、 そのメッセージは決して選択されることはありません。

セレクターには、以下のものを含めることができます。
  • リテラル:
    • ストリング・リテラルは、単一引用符で囲まれます。 連続した 2 つの単一引用符は、単一引用符を表します。 例は、'literal' および 'literal''s' です。 Java ストリング・リテラルと同様に、これらは Unicode 文字エンコードを使用します。 二重引用符を使用してストリング・リテラルを囲むことはできません。 単一引用符に囲まれた中では、任意のバイトのシーケンスを使用できます。
    • バイト・ストリングは、二重引用符で囲まれた 1 対以上の 16 進数文字で、接頭部が 0x です。 例えば、0x2F1C0XD43A などです。 バイト・ストリングの長さは、少なくとも 1 バイト必要です。 セレクターのバイト・ストリングをタイプ MQTYPE_BYTE_STRING のメッセージ・プロパティーに突き合わせるとき、先行ゼロまたは後続ゼロについては特別な処置は行われません。 そのバイトは別の文字として扱われます。 エンディアン種別も 考慮されません。 セレクターのバイト・ストリングとプロパティーのバイト・ストリングの両方の長さは等しくなければならず、バイトのシーケンスは同じでなければなりません。
      一致するバイト・ストリング選択の例を以下に示します (myBytes = 0AFC23 と想定)。
      • myBytes = 0x0AFC23 = TRUE
      以下のストリング選択は一致しません。
      • myBytes = 0xAFC23 = MQRC_SELECTOR_SYNTAX_ERROR ( バイト数が 2の倍数ではないため )
      • myBytes = 0x0AFC2300 = FALSE ( 比較において後続ゼロが有意であるため )
      • myBytes = 0x000AFC23 = FALSE ( 比較において先行ゼロが有意であるため )
      • myBytes = 0x23FC0A = FALSE ( エンディアンネスは考慮されないため )
    • 16 進数はゼロで始まり、大文字または小文字の x が続きます。 リテラルの残りの部分は、1 つ以上の有効な 16 進数文字となります。 例は、0xA0xAF0X2020 です。
    • 先行ゼロの後に 0-7 の範囲の 1 つ以上の数字が続いているものは、 常に 8 進数の開始と解釈されます。 接頭部がゼロの 10 進数で表すことはできません。例えば 09 の場合、9 は有効な 8 進数字ではないため構文エラーが戻されます。 8 進数字の例は、01770713 です。
    • 厳密な数値リテラルは、小数点のない数値 ( 57-957+62など) です。 正確な数字リテラルには、末尾に大文字または小文字の L を付けることができます。これが数値の格納または解釈の方法に影響を与えることはありません。 IBM MQ は、 -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807までの範囲の正確な数表示をサポートします。
    • 近似数値リテラルは、7E3 または -57.9E2 などの浮動小数における数値、または 7.-95.7、または +6.2 などの小数部を持つ数値です。 IBM MQ は、 -1.797693134862315E+308 から 1.797693134862315E+308までの範囲の数値をサポートします。

      仮数部はオプションの符号文字 (+ または -) の後に 続きます。 仮数部は、整数または小数のいずれかです。 仮数部の小数部分には、先行桁は必要ありません。

      大文字または小文字の E は、オプションの指数の開始を示します。 指数の基数は 10 進であり、 指数の数字部分にはオプションで符号文字を接頭部に付ける ことができます。

      近似数値リテラルは、文字 F または D (大/小文字の区別はない) で終了できます。 この構文は、短精度または倍精度の数値をタグ付けするための、多言語に対応する方式を サポートするために存在しています。 これらの文字はオプションであり、 近似数値リテラルがどのように格納または処理されるのかには影響 しません。 これらの数値は常に倍精度を使用して格納および処理されます。

    • ブール・リテラルの TRUE および FALSE
    注: NaN+Infinity-Infinity などの非有限 IEEE-754 表現は、選択文字列ではサポートされません。 従って、これらの値を式の中でオペランドとして 使用することはできません。 負のゼロは、数学演算では正のゼロと して扱われます。
  • ID:

    ID は可変長文字シーケンスで、必ず有効な ID 開始文字で始まり、ゼロまたはそれ以上の有効な ID 部分文字が続きます。 ID 名の規則は、メッセージ・プロパティー名の規則と同じです。詳しくは、 プロパティー名 および プロパティー名の制約事項 を参照してください。

    注: メッセージ・ペイロードに対して選択を実行できるのは、拡張メッセージ選択プロバイダーが使用可能な場合のみです。

    ID は、ヘッダー・フィールド参照またはプロパティー参照のいずれかです。 メッセージ・セレクター内のプロパティー値のタイプは、プロパティーの設定に使用されるタイプに対応していなければなりません。ただし、可能な場合に数値プロモーションが実行されます。 タイプの不一致が起きると、式の結果は FALSE となります。 メッセージ内に存在しないプロパティーが参照されると、その値は NULL となります。

    プロパティーのゲット・メソッドに適用する型変換は、メッセージ・セレクター式でプロパティーが使用されている場合には適用されません。 例えば、ストリング値としてプロパティーを設定し、それを数値として照会するためにセレクターを使用すると、式は FALSE を戻します。

    プロパティー名または MQMD フィールド名にマップされる JMS フィールド名およびプロパティー名も、選択ストリング内の有効な ID です。 IBM MQ は、認識された JMS フィールド名とプロパティー名をメッセージ・プロパティー値にマップします。 詳しくは、 JMS でのメッセージ・セレクター を参照してください。 例えば、選択ストリング JMSPriority >= は、現行メッセージの jms フォルダーにある 「1 次」 プロパティーを選択します。

  • オーバーフロー/アンダーフロー:
    10 進数および近似数値の両方で、 以下は定義されていません。
    • 定義された範囲に入っていない数の指定
    • オーバーフローまたはアンダーフローを引き起こす可能性のある算術式の指定
    これらの条件は検査されません。
  • 空白文字:
    スペース、用紙送り、改行、復帰、水平タブ、または垂直タブとして定義されます。 以下の Unicode 文字は空白文字として認識されます。
    • \u0009 to \u000D
    • \u0020
    • \u001C
    • \u001D
    • \u001E
    • \u001F
    • \u1680
    • \u180E
    • \u2000 から \u200A
    • \u2028
    • \u2029
    • \u202F
    • \u205F
    • \u3000
  • 式:
    • セレクターは、条件式です。 true に評価されるセレクターは一致し、false または unknown に評価されるセレクターは一致しません。
    • 演算式は、それ自体と、算術演算、ID (ID 値は数値リテラルとして扱われる)、および数値リテラルから構成されています。
    • 条件式は、それ自体と、比較演算、および論理演算から構成されています。
  • 標準の括弧 () (式が評価される順序を設定する) がサポートされています。
  • 論理演算子 (優先順位どおりに列挙): NOTANDOR
  • 比較演算子: =>>=<<=<> (等しくない)。
    • 2 つのバイト・ストリングが等しいのは、両ストリングが同じ長さで、バイトのシーケンスが等しい場合のみ です。
    • 同じタイプの値のみを比較できます。 唯一の例外は、 正確な数値と近似数値の比較が有効であることです (必要 な型変換は Java 数値 上位変換の規則によって定義されます)。 異なるタイプを比較する試みがある場合、セレクターは常に false です。
    • ストリングとブールの比較は、= および <> に制限されます。 2 つのストリングは、それらのストリングに含まれている文字シーケンスがまったく同じ場合にのみ等しくなります。
  • 算術演算子 (優先順位どおりに列挙):
    • +, - 単項。
    • 乗算 *、および除算 /
    • 加算 +、および減算 -
    • ヌル値での算術演算はサポートされていません。 ヌル値での算術演算が試行される場合、完全セレクターは常に false です。
    • 算術演算では、 Java 数値プロモーションを使用する必要があります。
  • arithmetic-expr1 [NOT] BETWEEN arithmetic-expr2 and arithmetic-expr3 比較演算子:
    • Age BETWEEN 15 and 19age>= 15 AND age <= 19と同等です。
    • Age NOT BETWEEN 15 and 19age < 15 OR age > 19と同等です。
    • BETWEEN 演算の式のいずれかがヌルである場合、演算の値は false です。 NOT BETWEEN 演算の式のいずれかが NULL である場合、演算の値は true です。
  • ID がストリング値または NULL 値を持つ場合の ID [NOT] IN (string-literal1, string-literal2,...) 比較演算子。
    • Country IN ('UK', 'US', 'France')'UK' の場合には true であり、'Peru' の場合には false です。 これは、式 (Country = 'UK') OR (Country = 'US') OR (Country = 'France')と同等です。
    • Country NOT IN ('UK', 'US', 'France')'UK' の場合には false であり、'Peru' の場合には true です。 これは、式 NOT ((Country = 'UK') OR (Country = 'US') OR (Country = 'France'))と同等です。
    • IN または NOT IN 演算の ID がヌルである場合、演算の値は不明です。
  • identifier [NOT] LIKE pattern-value [ESCAPE escape-character ] 比較演算子。 identifier にはストリング値があります。 pattern-value はストリング・リテラルです。ここで、_ は単一文字を表しており、% は文字シーケンス (空のシーケンスを含む) を表しています。 その他のすべての文字はそれ自体を表しています。 オプションの escape-character は、 pattern-value内の _ および % の特殊な意味をエスケープするために使用される単一文字ストリング・リテラルです。 LIKE 演算子は、2 つのストリング値の比較のみに使用する必要があります。
    • phone LIKE '12%3' は、123 および 12993 の場合には true で、1234 の場合には false です。
    • word LIKE 'l_se' は、lose の場合には true で、loose の場合には false です。
    • underscored LIKE '\_%' ESCAPE '\'_foo の場合には true であり、bar の場合には false です。
    • phone NOT LIKE '12%3' は、123 および 12993 の場合には false で、1234 の場合には true です。
    • LIKE 操作または NOT LIKE 操作の ID が NULLである場合、操作の値は不明です。
    注: 2 つのストリング値を比較するには、 LIKE 演算子を使用する必要があります。 Root.MQMD.CorrelId の値は、文字ストリングではなく、24 バイトのバイト配列です。 セレクター・ストリング Root.MQMD.CorrelId LIKE 'ABC%' は、構文的に有効なものとしてパーサーは受け付けますが、false に評価されます。 このため、バイト配列を文字ストリングと比較するときには、LIKE を使用することはできません。
  • identifier IS NULL 比較演算子は、 NULL ヘッダー・フィールド値、または欠落しているプロパティー値をテストします。
  • identifier IS NOT NULL 比較演算子は、ヌル以外のヘッダー・フィールド値またはプロパティー値の存在をテストします。
  • ヌル値
    NULL 値を含むセレクター式の評価は、以下のように SQL 92 NULL セマンティクスによって定義されます。
    • SQL は、 NULL 値を不明として扱います。
    • 不明値を持つ比較または算術は、常に、不明値を生じさせます。
    • IS NULL および IS NOT NULL 演算子は、不明値を TRUE および FALSE 値に変換します。
    ブール演算子は、3 つの値を持つロジックを使用します (T=TRUEF=FALSEU=UNKNOWN)。
    表 1. ロジックが A AND B の場合のブール演算子の結果
    演算子 A 演算子 B 結果 (A AND B)
    T F F
    T U U
    T T T
    F T F
    F U F
    F F F
    U T U
    U U U
    U F F
    表 2. ロジックが A OR B の場合のブール演算子の結果
    演算子 A 演算子 B 結果 (A OR B)
    T F T
    T U T
    T T T
    F T T
    F U U
    F F F
    U T T
    U U U
    U F U
    表 3. ロジックが NOT A の場合のブール演算子の結果
    演算子 A 結果 (NOT A)
    T F
    F T
    U U
以下のメッセージ・セレクターは、メッセージ・タイプが car、色が blue、重量が 2500 lbs より大きいというメッセージを選択します。
"JMSType = 'car' AND color = 'blue' AND weight > 2500"

SQL は固定小数点の比較および算術をサポートしますが、メッセージ・セレクターはサポートしません。 これは、正確な数値リテラルが小数部を持たない数値リテラルに制限されるためです。 また同じ理由で、近似数値の代替表記として小数部を持つ数値があります。

SQL コメントは、サポートされていません。