首页 > 解决方案 > 如何获取 SET 列中包含未知值的行?

问题描述

数据库是 MySQL 5.6

CREATE TABLE set_t
(
set_r  SET ('a', 'b', 'c')
);

INSERT INTO set_t (set_r) VALUES ('a,b,c'), ('a,b');

就我而言,我只知道'a'和'b'。

例如,需要选择 set_r 为“a,b,c”的行。

值“c”未知,不能在查询中使用。

值顺序也是未知的。它们可能是 set_r SET ('c', 'b', 'a') 或其他。

如何选择包含未知值的行?

标签: mysqlsqlfind-in-set

解决方案


为您的示例数据执行此操作的简单方法是NOT IN

SELECT *
FROM set_t
WHERE set_r NOT IN ('a', 'b', 'a,b')

a但是,如果您有更大的集合并且您希望b在已知成员列表中包含比已知成员更多的成员,则这不能很好地扩展。

集合的每个成员都存储为数值。
在您的设置中,数值为:

SET Member  Decimal Value   Binary Value
'a'         1               001
'b'         2               010
'c'         4               100

因此,像这样的值'a,b'被存储为3(Binary 011)
,像这样的值'a,b,c'被存储为7(Binary 111)

如果您知道已知成员的数值,您可以通过它们在集合中定义的顺序获得,那么您可以使用位操作来获得您想要的:

SELECT *
FROM set_t
WHERE set_r | 3 <> 3 -- 3 is the numeric value of 'a,b'

或者:

SELECT *
FROM set_t
WHERE set_r | 0b11 <> 0b11 -- 0b11 is the numeric binary value of 'a,b'

请参阅演示


推荐阅读