首页 > 解决方案 > MySQL /在集合中查找不在列中的值

问题描述

我有一些包含逗号分隔列表和三列的数据。我想要的是找到存在于列表中但不存在于任何列中的值。

数据

+-------+-------+--------+-----------------+
| col_a | col_b | col_c  | list            |
+-------+-------+--------+-----------------+
| red   | NULL  | green  | yellow,blue     |
| red   | blue  | green  | red,blue,green  |
| red   | NULL  | yellow | green           |
| blue  | white | green  | red,white,green |
| NULL  | NULL  | NULL   | red,blue,green  |
+-------+-------+--------+-----------------+

期望的输出:

+-------+-------+--------+-----------------+----------------+
| col_a | col_b | col_c  | list            | unmatched      |
+-------+-------+--------+-----------------+----------------+
| red   | NULL  | green  | yellow,blue     | yellow,blue    |
| red   | blue  | green  | red,blue,green  |                |
| red   | NULL  | yellow | green           | green          |
| blue  | white | green  | red,white,green | red            |
| NULL  | NULL  | NULL   | red,blue,green  | red,blue,green |
+-------+-------+--------+-----------------+----------------+

目前我有一个有效的查询,但它非常难看:

SELECT *,
TRIM(
    BOTH ',' FROM 
    REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(
                    LIST,
                    IFNULL(col_a,''),
                    ''
                ),
                IFNULL(col_b,''),
                ''
            ),
            IFNULL(col_c,'')
            ,''
        ),
        ',,',
        ','
    )
) AS unmatched
FROM color_list

有没有更简洁的方法来查找unmatched值?我在这里做的事情真的很难扩展,而且感觉很尴尬和脆弱。

这是一个小提琴。

标签: mysql

解决方案


推荐阅读