2016-12-19 2 views
0

I持ちのVertica DBに以下のtabel:SQL:specfic値を持つ行の選択、列から独立し

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

は、私は、その結果、アイテムABを持っているすべての行を見つけたいです表:

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

ランダムでどのようにAB起こるの順。これは抽象的な例でもあり、私は4つのアイテムのうちの3つ、または1つのアイテムだけを探したいかもしれません。順序に依存しない特定の項目が含まれている場合、各行を確認する簡単な方法はありますか?

答えて

4
select  * 

from  mytable 

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

はい両方とも仕事。行全体をスキャンしたいので、列の列挙をスキップするために飛び回っていましたが、周囲にエレガントな方法がないようです。 – valenzio

0

TRY THIS:

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) 
関連する問題