基于条件返回布尔列的CQL查询



是否有可能从检查条件的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中已经习惯的东西。对于idroles 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:

可以获得1或0的结果
SELECT COUNT(*)
FROM Test
WHERE Id = '123' AND Roles CONTAINS 'Pilot'
ALLOW FILTERING

您需要ALLOW FILTERING来抑制性能警告。

相关内容

  • 没有找到相关文章

最新更新