我试图有条件地选择我桌子的某些栏目 我桌子的结构可能看起来很奇怪,但我对此没有影响:
| 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... |
此表分为3个部分,最后标有|X
。
col1|1
和col2|1
col1|2
和col2|2
col1|3
和col2|3
我只想要每个部分,如果col2
部分为IS NOT NULL
。
这是我的方法:
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
仅当所有col2
都是NOT NULL
时才有效,但如果其中一个IS NULL
,则整个结果为空。
如果您替换我的示例表中的两个NULL
- 值,您将获得所有6列,这是正确的,因为在这种情况下,任何部分都不会是NULL
。
在我的例子中,我想要输出:
| col1|1 | col2|1 | col1|3 | col2|3 |
|:------:|:------:|:------:|:------:|
| abc | def | my | text |
答案 0 :(得分: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列,即查询的结果:
+----+--------+--------+--------+--------+--------+--------+
| | col1|1 | col2|1 | col1|2 | col2|2 | col1|3 | col2|3 |
+----+--------+--------+--------+--------+--------+--------+
| 1 | abc | def | NULL | NULL | my | text |
+----+--------+--------+--------+--------+--------+--------+
答案 1 :(得分:0)
在MySQL中,查询无法在其结果中生成动态列数。因此,不可能有条件地选择表的某些列。查询结果将始终返回六列。 但您可以尝试选择表格的所有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