【Transact-SQL】IN句で複数列の条件を指定したい

この記事は約2分で読めます。

応用コードシリーズになります。

今回はSQL構文の「IN句」を便利に使う方法です。
主に復号主キーのテーブルを絞る際に、すべての主キーで絞りこむといった使い方が予想されます。

通常の使用方法.

IN句は1列での比較絞り込みしかできません。

下記の構文はIN句を通常使用したときのコード例になります。

SELECT
    ID
    ,NAME
FROM
    EMPLOYEE
WHERE
    ID  IN (
        SELECT
            WHERE_FARMER.WHERE_ID
        FROM
            FARMER
    )

やり方.

IN句を普通の使い方をしていては、複数列での比較は不可能です。

そのため、列①と列②の境目に目印となる区切り文字列を挿入し結合させ、IN句内の副問合せ部分も同様の構造にすることで、疑似的に複列での比較を可能としています。

CONVERT(varchar, [カラム名1]) + [区切り文字列] + CONVERT(varchar, [カラム名2])
IN
(
    SELECT
        CONVERT(varchar, [条件1]) + [区切り文字列] + CONVERT(varchar, [条件2])
    FROM
        [条件用テーブル]
    WHERE
        [絞り込み条件]
)

コード例.

コード例では、列「ID」と列「NAME」を区切り文字列「@」を挟み結合させ、
IN句内でも同じ構造とすることで、
列「ID」と列「NAME」が両方一致しないとヒットしないという
IN句でANDを実現する構文となっています。

SELECT
    ID
    ,NAME
FROM
    EMPLOYEE
WHERE
    CONVERT(varchar, ID) + ‘@’ + CONVERT(varchar, NAME)
    IN
    (
        SELECT
            CONVERT(varchar, ID) + ‘@’
             + CONVERT(varchar, NAME)
        FROM
            FARMER
        WHERE
            VOLUME > 100
    )