LIKE
条件允许我们在SQL语句的where子句中使用通配符。这使得我们能够执行模式匹配,LIKE
条件可以用于任何有效的SQL语句——select、insert、update或delete。像这样:
SELECT * FROM users
WHERE user_name like 'babu%';
与上述操作类似,在CLI中对Cassandra可用的任何查询都是可用的。
LIKE
条件允许我们在SQL语句的where子句中使用通配符。这使得我们能够执行模式匹配,LIKE
条件可以用于任何有效的SQL语句——select、insert、update或delete。像这样:
SELECT * FROM users
WHERE user_name like 'babu%';
与上述操作类似,在CLI中对Cassandra可用的任何查询都是可用的。
自Cassandra 3.4(建议使用3.5版本)以来,可以使用SSTable Attached Secondary Index(SASI)来实现LIKE查询。
例如:
CREATE TABLE cycling.cyclist_name (
id UUID PRIMARY KEY,
lastname text,
firstname text
);
按以下方式创建SASI:
CREATE CUSTOM INDEX fn_prefix ON cyclist_name (firstname)
USING 'org.apache.cassandra.index.sasi.SASIIndex';
然后前缀 LIKE 查询是有效的:
SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';
这些示例和更多配置选项,例如后缀查询,可以在文档中找到。CREATE CUSTOM INDEX idx_name ON keyspace.columnfamily (column_name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'CONTAINS',
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
'case_sensitive': 'false'};
为了使%keyword%
(两个%s) 生效,索引必须具有mode: CONTAINS选项以及analyzer_class,以使case_sensitive生效。我知道:这是一个老问题,但有一个解决方案:
在cassandra中不能使用like运算符,但可以使用范围运算符,并且使用范围运算符,您可以解决类似于“like 'whatever%'”的问题。
例如: 我有多个产品。每个产品都有自己的分区键(主键的第一部分):
CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));
现在我有一些用户:
INSERT INTO user(productId, username) VALUES (1, 'anna');
INSERT INTO user(productId, username) VALUES (1, 'alpha');
INSERT INTO user(productId, username) VALUES (1, 'andreas');
INSERT INTO user(productId, username) VALUES (1, 'alex');
INSERT INTO user(productId, username) VALUES (1, 'bernd');
INSERT INTO user(productId, username) VALUES (1, 'bob');
现在,我想查找所有以字母a开头的用户。在SQL中,我使用LIKE 'a%',在Cassandra中我使用以下查询语句:
SELECT * FROM users WHERE username >= 'a' AND username < 'b';
SELECT * FROM user WHERE productId = 1 AND username >= 'a' AND username < 'b';
结果:
productid | username
-----------+----------
1 | alex
1 | alpha
1 | andreas
1 | anna
username LIKE 'a%'
,则应该是 username >= 'a'
,因为 a
是匹配项。当然,您也可以匹配单词。user_name >= 'baby'
也能正常工作。实际上,我已经多次使用了这个方法。 - Alexis Wilkehttps://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html
这是v0.8版本的命令参考文档:http://www.datastax.com/docs/0.8/references/cql#cql-reference
如果你维护另一组包含对用户名的引用的行:CQL的LIKE语句出现在Scylla Open Source 3.2 RC1中,这是一个兼容CQL的数据库Scylla的发布候选版。我们希望在发布之前得到反馈意见。以下是详细信息:
新的CQL LIKE关键字允许将任何列与搜索模式匹配,使用%作为通配符。请注意,LIKE仅与ALLOW FILTERING一起使用。
LIKE语法支持:
'_'匹配任何单个字符
'%'匹配任何子串(包括空字符串)
'\'转义下一个模式字符,因此它与原样匹配
任何其他模式字符都与其本身匹配
空模式匹配空文本字段
例如:
INSERT INTO t (id, name) VALUES (17, ‘Mircevski’)
SELECT * FROM t where name LIKE 'Mirc%' allow filtering