2017-02-22 11 views
1

テーブルの一部の列を条件付きで選択しようとしています。
私のテーブルの構造は奇妙に見える可能性があり、私はそれに影響を及ぼさない:条件付きでテーブルの一部を選択します。

| id | col1|1 | col2|1 | col1|2 | col2|2 | col1|3 | col2|3 | 
|:--:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:| 
| 1 | some   | meaningless | text   | don't  | mind   | me   | 
| 2 | abc   | def   | NULL   | NULL   | my   | text   | 
| 3 | dummytext... | dummytext... | dummytext... | dummytext... | dummytext... | dummytext... | 

このテーブルは終わり|Xでマークされた3つの部分に分割されます。

  1. col1|1col2|1
  2. col1|2col2|2
  3. col1|3col2|3

その一部IS NOT NULLcol2場合、私は、各パートをしたいです。


これは私のアプローチです:作品場合は、すべてのcol2NOT NULLが、それらIS NULLの1場合は、全体の結果が空の場合にのみ

SELECT t1.`col1|1`, t1.`col2|1`, t2.`col1|2`, t2.`col2|2`, t3.`col1|3`, t3.`col2|3` 
FROM tab1 t1 
LEFT JOIN tab1 t2 On t1.`id` = t2.`id` 
LEFT JOIN tab1 t3 on t1.`id` = t3.`id` 
WHERE 
t1.`col2|1` IS NOT NULL 
AND t2.`col2|2` IS NOT NULL # this column is NULL, so I don't want it (including table t2) 
AND t3.`col2|3` IS NOT NULL 
AND t1.`id` = 2 
AND t2.`id` = 2 
AND t3.`id` = 2 

例の表にNULLの値を置き換えた場合、この場合はNULLになることはないため、6列すべてを取得できます。私の例では


、私はその出力をしたい:

| col1|1 | col2|1 | col1|3 | col2|3 | 
|:------:|:------:|:------:|:------:| 
| abc | def | my  | text | 

Here is a fiddle

+0

なぜLEFT JOINを捨てて、右側のテーブルにNULLがないことを確認しますか?代わりにINNER JOINが必要なようです。 – jarlh

+0

サンプル入力セット全体に対して望ましい出力を投稿できますか?動的な列数を求めているようです。 – Shruti

+0

'SELECT'クエリは、固定された列とその名前を指定します。結果セットに不確定な数の列が必要な場合は、動的SQLを使用する必要があります。 –

答えて

0

私はあなたのコードを変更:

SELECT t1.`col1|1`, t1.`col2|1`, t2.`col1|2`, t2.`col2|2`, t3.`col1|3`, t3.`col2|3` 
FROM 
tab1 t 
LEFT JOIN tab1 t1 On t.`id` = t1.`id` AND t1.`col2|1` IS NOT NULL 
LEFT JOIN tab1 t2 On t.`id` = t2.`id` AND t2.`col2|2` IS NOT NULL 
LEFT JOIN tab1 t3 on t.`id` = t3.`id` AND t3.`col2|3` IS NOT NULL 
WHERE 
t.`id` = 2 

それは説明した論理を実現しますが、NULL列を除外しない、クエリの結果:MySQLのクエリ缶で

+----+--------+--------+--------+--------+--------+--------+ 
| | col1|1 | col2|1 | col1|2 | col2|2 | col1|3 | col2|3 | 
+----+--------+--------+--------+--------+--------+--------+ 
| 1 | abc | def | NULL | NULL | my  | text | 
+----+--------+--------+--------+--------+--------+--------+ 
+0

単純なものとどのように違うのですか? 'SELECT * FROM tab1 WHERE id = 2'? – user1170330

+0

col2がNULLの場合、col1にNULLを返します。実際のテーブルには6列しかありませんか? – banazs

+0

いいえ、私はそれらをすべて選択する必要があります。 – user1170330

0

その結果に動的な列数を生成しません。したがって、条件付きでテーブルの列を選択することはできません。クエリの結果は常に6つの列を返します。 しかし、テーブルの3つの部分すべてを選択しようとすることができます。各パーツについて、そのパーツのcol2がNULLの場合、そのパーツのcol1もNULLになります。

SELECT IF(`col2|1` IS NULL, NULL, `col1|1`) AS `col1|1`, `col2|1`, 
     IF(`col2|2` IS NULL, NULL, `col1|2`) AS `col1|2`, `col2|2`, 
     IF(`col2|3` IS NULL, NULL, `col1|3`) AS `col1|3`, `col2|3` 
FROM tab1 
WHERE `id` = 2 
+0

単純なものとどのように違うのですか? 'SELECT * FROM tab1 WHERE id = 2'? – user1170330

+0

あなたはこのリンクの違いを見ることができますhttp://rextester.com/GBDM97429 –