Cassandra3.11.11如何仅用IN运算符检索表ch4列指定字符串
Cassandra 3.11.11 基于IN运算符检索多值字段的可行方案
你当前的写法select * from table1 where 'T04014' IN (ch4)无法直接生效,IN运算符要求右侧为值列表,当ch4是单个拼接字符串时,只会判断'T04014'是否等于ch4的完整值,无法匹配字符串内部的子串。以下是完全符合你要求(仅用IN、不用LIKE,可调整主键设置)的可行方案:
最优方案:调整数据模型为宽行结构,将ch4单个值纳入主键
该方案完全贴合Cassandra的分布式存储规则,查询性能最优,完全满足IN查询要求。
1. 重建表调整主键结构
将原来单条数据对应多个ch4值的结构,拆分为每个ch4值对应一行数据,把ch4设为聚类键(也可根据查询需求设为分区键):
CREATE TABLE table1 ( ch1 text, ch2 bigint, ch3 bigint, ch4 text, -- 可根据实际查询场景调整主键顺序,这里保留ch1为分区键,ch4为第一聚类键 PRIMARY KEY (ch1, ch4, ch2) );
如果你的查询场景固定为仅按ch4检索,也可以直接把ch4设为分区键,查询时不需要带ch1条件。
2. 按新结构写入数据
将原来的单条数据按ch4的不同值拆分为多行写入:
-- 写入第一条示例数据 INSERT INTO table1 (ch1, ch2, ch3, ch4) VALUES ('LD', 9813970, 1484914, 'T03103'); INSERT INTO table1 (ch1, ch2, ch3, ch4) VALUES ('LD', 9813970, 1484914, 'T04014'); -- 写入第二条示例数据 INSERT INTO table1 (ch1, ch2, ch3, ch4) VALUES ('LD', 1008203, 1486104, 'T03103'); INSERT INTO table1 (ch1, ch2, ch3, ch4) VALUES ('LD', 1008203, 1486104, 'T04024');
3. 用IN运算符执行查询
完全符合你的使用要求,不需要用到LIKE:
-- 检索所有包含T04014的数据 SELECT * FROM table1 WHERE ch1='LD' AND ch4 IN ('T04014'); -- 同时检索多个ch4值也可直接扩展IN列表 SELECT * FROM table1 WHERE ch1='LD' AND ch4 IN ('T04014', 'T04024');
如果需要返回去重后的原始数据行,只需要在查询时加上DISTINCT ch1, ch2, ch3即可。
补充可选方案(不符合仅用IN要求,仅作参考)
如果不想改宽行结构,也可以将ch4设为set<text>类型并创建二级索引,但该方案需要用CONTAINS关键字查询,性能低于宽行方案,仅适合数据量不大的场景。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

