Cassandra CQL-将system.local表中的release_version列转换为int



我正在cql中编写一个查询,检查Cassandra的发布版本是否大于或等于3.11.10。

select * from system.local where release_version >= '3.11.10'

由于release_version是数据类型的文本,这将不起作用,我找不到获得该值的子字符串的方法,也找不到将该值强制转换为int的方法。

我无法为此创建函数,因为我无法在系统表上创建函数。我也不能使用Java/Python等,这必须在cql中完成。

我也尝试过在where语句中插入子句,但我似乎无法在没有错误的情况下在in中输入多个值:

还不支持非主键列(release_version(上的

IN谓词

有人知道如何做到这一点或如何执行这一点的变通方法吗?

不幸的是,在CQL中没有一种本机实现这一点的方法。

如果你不能执行代码,那么至少你必须在shell脚本中执行。干杯

因此,如果添加ALLOW FILTERING指令,原始查询可以工作:

> SELECT cluster_name, release_version FROM system.local
WHERE release_version >= '3.11.10' ALLOW FILTERING;
cluster_name           | release_version
------------------------+-----------------
Aarons 3.11.10 Cluster |         3.11.10
(1 rows)

通常我不会建议使用ALLOW FILTERING,但system密钥空间使用LocalStrategy,因此查询将只转到单个节点。这也适用于类似>= '3.0'>= '3.11',甚至< '4.0'的比较。

由于release_version是数据类型文本,这将不起作用,我找不到获得该值的子字符串的方法,也找不到将该值强制转换为int的方法。

这里的数据类型不是一个停止显示的对象。这里(在字符串上(的比较显然是";ASCII二进制,";而不是alpha〔betical | numeric〕。但是,对于一个只有一行的表来说,排序顺序应该无关紧要。

编辑

无法为此创建函数,因为我无法在系统表上创建函数。

True语句。但是,您可以在另一个键空间中创建函数,并在系统表上使用。

如果我在低于3.11.10的版本上执行选择(例如,如果我在3.11.8上运行相同的选择,我会得到结果(

明白了。要解决这个问题,你可以构建一个函数。我能让它发挥作用,但它有点";脾气暴躁"因此,我创建了一个名为concat311的新用户定义函数,它取一个整数并将其添加为字符串"的补丁级别版本;3.11.";

CREATE OR REPLACE FUNCTION stackoverflow.concat311 (input INT)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return "3.11." + String.format("%02d", input);';

本质上,它将补丁级别的版本号返回为"0";零填充;因此可以成功地将其与CCD_ 9列值进行比较。

> SELECT cluster_name, release_version, stackoverflow.concat311(7) FROM system.local
WHERE release_version > stackoverflow.concat311(7) ALLOW FILTERING;
cluster_name           | release_version | stackoverflow.concat311(7)
------------------------+-----------------+----------------------------
Aarons 3.11.10 Cluster |         3.11.10 |                    3.11.07
(1 rows)

这里的缺点是,这在等式约束下不起作用("3.11.8"!="3.11.08"(。但它在[更大|更小]的情况下会起作用。

最新更新