21

次のようなクエリがあります。

SELECT
  *
FROM table
WHERE
  (col1, col2) in (
    ('col1_val1', 'col2_val1'),
    ('col1_val2', 'col2_val2'),
    ('col1_val3', 'col2_val3'),
  )

これは MySQL では機能しますが、sqlite3 では構文エラーで失敗します。

Error: near ",": syntax error

このクエリを sqlite3 で動作する同等のクエリに書き直すにはどうすればよいですか?

4

3 に答える 3

14

お気に入りのバージョンを選択してください:

http://sqlfiddle.com/#!5/6169b/9

一時テーブルの使用

CREATE TEMPORARY TABLE pair (a INTEGER, b INTEGER);
INSERT INTO pair (a, b) VALUES (1, 1);
INSERT INTO pair (a, b) VALUES (2, 2);
....

データのペア; ペア (a,b) が一意でない場合

SELECT *
FROM data
WHERE EXISTS (
  SELECT NULL
  FROM  pair
  WHERE pair.a = data.a
    AND pair.b = data.b
);

データのペア; ペア (a,b) が一意の場合

SELECT     data.*
FROM       data
INNER JOIN pair
        ON pair.a = data.a
       AND pair.b = data.b;

データはペアではありません。ペア (a,b) が一意の場合

SELECT    data.*
FROM      data
LEFT JOIN pair
   ON pair.a = data.a
  AND pair.b = data.b
WHERE pair.a IS NULL
   OR pair.b IS NULL;

インライン テーブルの使用

データのペア; ペア (a,b) が一意でない場合

SELECT *
FROM data
WHERE EXISTS (
  SELECT NULL
  FROM  (
    SELECT 1 AS a, 1 AS b
    UNION ALL
    SELECT 2 AS a, 2 AS b
    UNION ALL
    SELECT 3 AS a, 3 AS b
  ) AS pair
  WHERE pair.a = data.a
    AND pair.b = data.b
);

データのペア; ペア (a,b) が一意の場合

SELECT     data.*
FROM       data
INNER JOIN (
  SELECT 1 AS a, 1 AS b
  UNION ALL
  SELECT 2 AS a, 2 AS b
  UNION ALL
  SELECT 3 AS a, 3 AS b
) AS pair
 ON  pair.a = data.a
AND  pair.b = data.b;

データはペアではありません。ペア (a,b) が一意の場合

SELECT    data.*
FROM      data
LEFT JOIN (
  SELECT 1 AS a, 1 AS b
  UNION ALL
  SELECT 2 AS a, 2 AS b
  UNION ALL
  SELECT 3 AS a, 3 AS b
 ) AS pair
   ON pair.a = data.a
  AND pair.b = data.b
WHERE pair.a IS NULL
   OR pair.b IS NULL;
于 2012-06-23T17:04:47.667 に答える
10

これは機能する簡単なソリューションですが、インデックスを使用できないため、大規模なデータ セットではうまく機能しない可能性があります。

SELECT * FROM table
WHERE col1 || '-' || col2 in (
  'col1_val1-col2_val1',
  'col1_val2-col2_val2',
  'col1_val3-col2_val3'
)

sqlfiddle で試してみてください

楽しみ!

于 2014-11-19T15:07:01.433 に答える