2016-12-19 5 views
0

У меня есть следующие Tabel в Vertica DB:SQL: Выберите строки, которые имеют specfic значения, независимо от колонки

+-----+-------+-------+-------+ 
| tid | Item1 | Item2 | Item3 | 
+-----+-------+-------+-------+ 
| 1 | A  | B  | C  | 
| 2 | B  | D  | A  | 
| 3 | C  | D  | A  | 
| 4 | D  | B  | A  | 
+-----+-------+-------+-------+ 

Я хочу, чтобы найти все строки, которые имеют товары A и B, в результате чего таблица:

+-----+-------+-------+-------+ 
| tid | Item1 | Item2 | Item3 | 
+-----+-------+-------+-------+ 
| 1 | A  | B  | C  | 
| 2 | B  | D  | A  | 
| 4 | D  | B  | A  | 
+-----+-------+-------+-------+ 

порядок, как происходит A и B является случайным. Кроме того, это абстрактный пример, я могу захотеть найти три из четырех элементов или даже один элемент. Есть ли простой способ проверить каждую строку, если она содержит определенные элементы, независимые от заказа?

ответ

4
select  * 

from  mytable 

where  'A' in (Item1,Item2,Item3) 
     and 'B' in (Item1,Item2,Item3) 
+0

Да, ey обе работают. Я прыгнул, чтобы пропустить перечисление столбцов, так как я просто хочу отсканировать всю строку, но кажется, что вокруг нет элегантного пути. – valenzio

0

TRY ЭТО:

SELECT * FROM TAB1 WHERE (ITEM1 IN ('A','B') AND ITEM2 IN ('A','B')) 
          OR (ITEM1 IN ('A','B') AND ITEM3 IN ('A','B')) 
          OR (ITEM2 IN ('A','B') AND ITEM2 IN ('A','B')) 
0

Другой подход может быть конкатенации столбцов в строку, и поиск этот столбец с INSTR:

SELECT a.tid, a.Items 
FROM 
    (SELECT tid, CONCAT(Item1, Item2, Item3) AS Items 
    FROM MyTable) AS a 
WHERE 
    INSTR(a.Items, "A") > 0 
    AND 
    INSTR(a.Items, "B") > 0 

etc. 

Столбцы в CONCAT и WHERE условие может быть если необходимо

0
mysql> select * from vertica where (item1 in("A") and (item2 in("B") or item3 in 
("B"))) or (item1 in("B") and (item2 in("A") or item3 in("A"))) or (item2 in("A" 
) and (item1 in("B") or item3 in("B"))) or (item2 in("B") and (item1 in("A") or 
item3 in("A"))) or (item3 in("A") and (item1 in("B") or item2 in("B"))) or (item 
3 in("B") and (item1 in("A") or item2 in("A"))); 

O/P -> 
+-----+-------+-------+-------+ 
| tid | item1 | item2 | item3 | 
+-----+-------+-------+-------+ 
| 1 | A  | B  | C  | 
| 2 | B  | D  | A  | 
| 4 | D  | B  | A  | 
+-----+-------+-------+-------+ 
3 rows in set (0.02 sec) 
Смежные вопросы