mysql - 如何获取 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') 或其他。
如何选择包含未知值的行?
解决方案
为您的示例数据执行此操作的简单方法是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'
请参阅演示。
推荐阅读
- graphql - 如何将参数传递给 Dataloader 批量查询函数?
- php - 在 Laravel 中将数据导出为 pdf,无论数据如何,仅下载 2 页
- node.js - package.json 中的 Mocha 测试路径参数
- amazon-web-services - AWS SQS 重新驱动策略,消息发送到队列的哪一端
- mongodb - 使用 localfield 中的键聚合多个集合
- php - 当 PHP、C++ 和 shell 脚本尝试访问同一个文件时,如何避免错误?
- sql - 将行透视到 Sql Server 中的列
- excel - 组合框不显示内容
- snakemake - 在 Snakemake HTML 报告中包含参数和源代码
- php - 将产品元数据移动到 WooCommerce 中的描述选项卡