如何重写多列IN子句以使用SQLite?

Eva*_*all 16 sqlite

我有一个看起来像这样的查询:

SELECT
  *
FROM table
WHERE
  (col1, col2) in (
    ('col1_val1', 'col2_val1'),
    ('col1_val2', 'col2_val2'),
    ('col1_val3', 'col2_val3'),
  )
Run Code Online (Sandbox Code Playgroud)

这适用于MySQL,但在sqlite3中失败并出现语法错误:

Error: near ",": syntax error
Run Code Online (Sandbox Code Playgroud)

如何将此查询重写为适用于sqlite3的等效查询?

biz*_*lop 11

选择您喜欢的版本:

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);
....
Run Code Online (Sandbox Code Playgroud)

数据IN对; 如果对(a,b)不是唯一的

SELECT *
FROM data
WHERE EXISTS (
  SELECT NULL
  FROM  pair
  WHERE pair.a = data.a
    AND pair.b = data.b
);
Run Code Online (Sandbox Code Playgroud)

数据IN对; 如果对(a,b)是唯一的

SELECT     data.*
FROM       data
INNER JOIN pair
        ON pair.a = data.a
       AND pair.b = data.b;
Run Code Online (Sandbox Code Playgroud)

数据不是成对的; 如果对(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;
Run Code Online (Sandbox Code Playgroud)

使用内联表

数据IN对; 如果对(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
);
Run Code Online (Sandbox Code Playgroud)

数据IN对; 如果对(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;
Run Code Online (Sandbox Code Playgroud)

数据不是成对的; 如果对(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;
Run Code Online (Sandbox Code Playgroud)


Joh*_*rug 8

这是一个易于使用的解决方案,但它可能无法在大型数据集上运行良好,因为它无法使用任何索引.

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

在sqlfiddle中尝试一下

请享用!


Ste*_*lot 8

在 sqlite 中尝试添加 VALUES 关键字:

SELECT *
FROM table
WHERE
  (col1, col2) in ( VALUES     --> add this keyword and remove the last ,
    ('col1_val1', 'col2_val1'),
    ('col1_val2', 'col2_val2'),
    ('col1_val3', 'col2_val3')
  )
Run Code Online (Sandbox Code Playgroud)

基本上在 sqLite 中执行查询:

VALUES
('col1_val1', 'col2_val1'),
('col1_val2', 'col2_val2');
Run Code Online (Sandbox Code Playgroud)

是相同的:

SELECT 'col1_val1' AS column1, 'col2_val1' AS column2
UNION 
SELECT 'col1_val2' AS column1, 'col2_val2' AS column2;
Run Code Online (Sandbox Code Playgroud)

或组合:

SELECT 'col1_val1' AS column1, 'col2_val1' AS column2
UNION  VALUES  ('col1_val2', 'col2_val2');
Run Code Online (Sandbox Code Playgroud)

所以你甚至可以这样写:

SELECT * 
  FROM table
  WHERE (col1, col2) IN ( 
      SELECT 'col1_val1', 'col2_val1'
      UNION 
      SELECT 'col1_val2', 'col2_val2'
  );
Run Code Online (Sandbox Code Playgroud)

这是一个简单的子查询,适用于所有/大多数数据库。