68027


以下のようなテーブルで、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]


CC BY-SA 4.0
2020-06-26T01:42:59.887
68006
2021-12-17T17:54:19.703
2020-06-26T04:08:25.760
3060
32891
question
sqlite
SQLite で複数のカラムを条件として抽出する方法


質問内容にあるSELECT文は、MySQLなどでは機能するそうですがSQLiteでは未サポートのようです。  
参考URLに解決策がありました。  
このようにIN句に使用する一次リストを作成します。

[code]

    ID_list = [0,0]
    Key_list = [1,2]
    W_list = [f'{k}_{id}' for k,id in zip(Key_list,ID_list)]
    
[/code]

SELECT文は以下のようになります。

[code]

    SELECT ID, name
    FROM Tbl_Dev AS t
    WHERE t.pkey || '_' || t.ID
    IN ('1_0','2_0')
    
[/code]

参考  
[SQL Search Query with multiple columns needs to
edited](https://stackoverflow.com/questions/14387585/sql-search-query-with-
multiple-columns-needs-to-edited/14388639#14388639)


CC BY-SA 4.0
2020-06-26T02:36:24.010
68011
2020-06-26T02:36:24.010
32891
68006
answer


自己解決された方法ではインデックスが効かず、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]


CC BY-SA 4.0
2020-06-26T08:30:27.700
68027
2020-06-26T08:30:27.700
9820
68006
answer


適切かどうかわからないけど、  
一度andを使ってwhere分を分けてやったら、  
エラーは発生しません。

[code]

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


CC BY-SA 4.0
2021-12-17T08:31:17.880
85197
2021-12-17T17:54:19.703
2021-12-17T17:54:19.703
32986
50549
68006
answer