SQLite で複数のカラムを条件として抽出する方法


以下のようなテーブルで、pkeyとIDが両方とも合致する条件として抽出したいです。  
IDやNameは重複する可能性があります。  
合致する条件はリストで任意に複数が与えられます。

[code]

    CREATE TABLE "Tbl_Dev" (
        "pkey"  INTEGER NOT NULL UNIQUE,
        "ID"    TEXT NOT NULL DEFAULT 0,
        "Name"  TEXT NOT NULL DEFAULT 'Unkown',
        PRIMARY KEY("pkey" AUTOINCREMENT)
    );
    
[/code]

仮のデータとして以下のようにしました。

[code]

    pkey|ID|Name
    1|0|Unkown1
    2|0|Unkown2
    3|0|Unkown3
    4|0|Unkown4
    
[/code]

試したSELECT文

[code]

    SELECT pkey,ID 
    FROM Tbl_Dev 
    WHERE （pkey, ID)
    IN (('1','0'),('2','0'))
    
[/code]

エラーメッセージ

[code]

    Execution finished with errors
    Result: row value misused
    
[/code]




自己解決された方法ではインデックスが効かず、pkeyやIDがINTEGER型の場合は暗黙の型変換が発生します。  
インデックスを有効にしたい場合は副問い合わせでダミー表を作成して結合する方法もあります。  
正直なところ可読性は下がりますので、インデックスの有無やレコード数、要求速度に合わせて対応方法を選択するのが良いと思います。

[SO本家の類似回答](https://stackoverflow.com/a/18365048)

[code]

    -- 疑似テーブル作成
    with Tbl_Dev as (
        select 1 pkey, 0 ID, 'Unkown1' Name union all
        select 2 pkey, 0 ID, 'Unkown2' Name union all
        select 3 pkey, 0 ID, 'Unkown3' Name union all
        select 4 pkey, 0 ID, 'Unkown4' Name)
    -- サンプルSQL
    select t.*
    from   Tbl_Dev as t
    -- (pkey, ID) in (('1','0'),('2','0')) の代用テーブル結合
    join  (select 1 pkey, 0 ID union all
           select 2 pkey, 0 ID) as lookup
    on     t.pkey = lookup.pkey
    and    t.ID   = lookup.ID
    
[/code]




自己解決された方法ではインデックスが効かず、pkeyやIDがINTEGER型の場合は暗黙の型変換が発生します。  
インデックスを有効にしたい場合は副問い合わせでダミー表を作成して結合する方法もあります。  
正直なところ可読性は下がりますので、インデックスの有無やレコード数、要求速度に合わせて対応方法を選択するのが良いと思います。

[SO本家の類似回答](https://stackoverflow.com/a/18365048)

[code]

    -- 疑似テーブル作成
    with Tbl_Dev as (
        select 1 pkey, 0 ID, 'Unkown1' Name union all
        select 2 pkey, 0 ID, 'Unkown2' Name union all
        select 3 pkey, 0 ID, 'Unkown3' Name union all
        select 4 pkey, 0 ID, 'Unkown4' Name)
    -- サンプルSQL
    select t.*
    from   Tbl_Dev as t
    -- (pkey, ID) in (('1','0'),('2','0')) の代用テーブル結合
    join  (select 1 pkey, 0 ID union all
           select 2 pkey, 0 ID) as lookup
    on     t.pkey = lookup.pkey
    and    t.ID   = lookup.ID
    
[/code]

