Вопрос по sqlite – Как я могу переписать многостолбцовое предложение IN для работы на SQLite?

15

Я получил запрос, который выглядит примерно так:

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

Это работает в MySQL, но не работает в sqlite3 с синтаксической ошибкой:

<code>Error: near ",": syntax error
</code>

Как я могу переписать этот запрос к эквивалентному, который работает в sqlite3?

Если не считать того, что вы только что написали в комментарии, я, вероятно, буду стремиться создать временную таблицу и выполнить многостолбцовый JOIN, чтобы получить нужные вам строки. Joe
Я знаю, что большинство диалектов SQL не поддерживают его; вот почему я хочу переписать это. Это значит в основномWHERE (col1 = 'col1_val1' AND col2 = 'col2_val1') OR (col1 = 'col1_val2' AND col2 = 'col2_val2') OR... Evan Krall
Большинство диалектов SQL этого не поддерживают. Это неявные AND или OR? Joe

Ваш Ответ

2   ответа
10

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

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

пары данных IN; если пара (a, b) не уникальна

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

пары данных IN; если пара (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;
using inline table

пары данных 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
);

пары данных 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;

данные НЕ В парах; если пара (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;
7

которое работает, но оно может не работать должным образом на больших наборах данных, поскольку не может использовать ни один из ваших индексов.

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

Попробуй это в sqlfiddle

Наслаждайтесь!

Похожие вопросы