MySQL "ЛЮБОЙ IN" запрос? - PullRequest
       38

MySQL "ЛЮБОЙ IN" запрос?

0 голосов
/ 31 августа 2018

Есть ли краткий способ сделать что-то подобное в MySQL:

WHERE s.loc1 IN ("A", "B", "C", "D") 
   OR s.loc2 IN ("A", "B", "C", "D") 
   OR s.loc3 IN ("A", "B", "C", "D");

без повторения бита ("A", "B", "C", "D") (и желательно таким образом, чтобы этот список все еще можно было передать через @param)? К сожалению, синтаксис (s.loc1, s.loc2, s.loc3) IN (бла), кажется, работает только для AND вместо OR.

Идеальное решение будет выглядеть примерно так:

WHERE (s.loc1, s.loc2, s.loc3) ANY IN ("A", "B", "C", "D");

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете сделать запрос из таблицы, сгенерированной (то есть из подзапроса таблицы или производной таблицы ) из объединения значений:

select
    *
from (
    (select loc1 as loc, s.* from s)
    union
    (select loc2 as loc, s.* from s)
    union
    (select loc3 as loc, s.* from s)
) t
where
    t.loc in ("A","B","C","D");

Выполнение вышеуказанного запроса дает:

+-----+------+------+------+
| loc | loc1 | loc2 | loc3 |
+-----+------+------+------+
| A   | A    | 2    | 3    |
| D   | D    | 2    | 3    |
| B   | 1    | B    | 3    |
| C   | 1    | 2    | C    |
+-----+------+------+------+

при запуске на этих составленных данных:

drop table if exists s;
create table s (
    loc1 varchar(255) not null,
    loc2 varchar(255) not null,
    loc3 varchar(255) not null
);
insert into s values
("1","2","3"),
("A","2","3"),
("1","B","3"),
("1","2","C"),
("D","2","3");

См. Также демоверсию

...