有条件地选择表

时间:2017-02-22 10:47:10

标签: mysql sql

我试图有条件地选择我桌子的某些栏目 我桌子的结构可能看起来很奇怪,但我对此没有影响:

| 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

  1. col1|1col2|1
  2. col1|2col2|2
  3. col1|3col2|3
  4. 我只想要每个部分,如果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   |
    

    Here is a fiddle

2 个答案:

答案 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