是否有可能从检查条件的CQL查询中检索真/假答案-例如,如果集合具有特定值?
考虑:
CREATE TABLE Test (Id text PRIMARY KEY, Roles set<text>)
INSERT INTO Test(Id, Roles)
VALUES ('123', {'Driver', 'Pilot', 'Janitor'})
我想根据与Id='123'
相关联的集合是否包含特定值来获得true或false值。这是我想要得到的一个假想的语法;它不工作:
SELECT
Roles CONTAINS 'Pilot' // <<== Not a valid syntax; this does not work
FROM Test
WHERE Id = '123'
好的,这是我在机场想到的,快速…
不幸的是,Cassandra CQL没有很多人们在SQL中已经习惯的东西。对于id
和roles CONTAINS 'Pilot'
的查询问题,我提出了一个类似的解决方案。
CREATE TABLE roles (Id text, Roles set<text>);
CREATE INDEX on roles(roles);
但是,我使用了二级索引来允许对roles
集合进行过滤。
布尔值有点棘手。我创建了一个用户定义函数(在cassandra.yaml中设置user_defined_functions_enabled: true
)。
UDF:
CREATE OR REPLACE FUNCTION textToBoolean (input TEXT)
RETURNS NULL ON NULL INPUT RETURNS BOOLEAN
LANGUAGE java AS 'if (!input.equals("True")) { return false; }
return Boolean.valueOf(input);';
然后这个就行了:
SELECT texttoboolean('True') AS success FROM roles WHERE id='123' AND roles CONTAINS 'Pilot';
success
---------
True
(1 rows)
UDF所做的只是让你在需要的时候返回一个布尔值True。如果成功,它返回true,如果失败,它什么也不返回。返回COUNT
的解决方案可能会更好地工作,这取决于您要完成的任务。
使用COUNT
:
SELECT COUNT(*)
FROM Test
WHERE Id = '123' AND Roles CONTAINS 'Pilot'
ALLOW FILTERING
您需要ALLOW FILTERING
来抑制性能警告。