如何将Cassandra/ScyllaDB文本转换为bigint,反之亦然



在PostgreSQL中,我可以这样做:

SELECT (col::BIGINT+1)::TEXT + '%' FROM bar WHERE id = 1
UPDATE bar SET col = (col::BIGINT+1)::TEXT WHERE id = 1 

如何在Cassandra/ScyllaDB中做到这一点?我需要将 TEXT 转换为 BIGINT 并转换回 TEXT 以更新列值,列本身必须是 TEXT,因为它不只存储数字。

在 cql 中没有默认函数。但您可以创建一个,请参阅 UDF。Cassandra支持UDF,但Scyladb还不支持UDF

让我们创建这些函数:

CREATE OR REPLACE FUNCTION bigintAstext (input bigint) CALLED ON NULL INPUT RETURNS text LANGUAGE java AS 'return String.valueOf(input);';
CREATE OR REPLACE FUNCTION textAsbigint (input text) CALLED ON NULL INPUT RETURNS bigint LANGUAGE java AS 'return Long.parseLong(input);';

在这里,bigintAstext会将 bigint 转换为文本,textAsbigint会将文本转换为 bigint

如何使用 ?

让我们创建一个表并插入数据

CREATE TABLE udf_test (
    id bigint PRIMARY KEY,
    data text
);
INSERT INTO udf_test (id , data ) VALUES ( 10, '10');

现在您可以像这样查询:

SELECT bigintAstext(id), textAsbigint(data) FROM udf_test ;

输出:

 test.bigintastext(id) | test.textasbigint(data)
-----------------------+-------------------------
                    10 |                      10

注意:UDF(用户定义函数(默认处于禁用状态,您可以通过在cassandra.yaml上设置enable_user_defined_functions: true来启用它

最新更新