如何使用条件select语句在Cassandra cql中包含字符“\ t”的一些数据

问题描述 投票:1回答:2

我使用datastax库和spring框架将数据插入到Cassandra表中

我使用分隔符“\ t”来连接两个字符串this.pid +“\ t”+ this.cid;

如果我选择插入的数据,我可以看到数据已保存

select * from table1;

 pid | cid       | key  | value | update_time
-----+-----------+------+-------+--------------------------
  1 | data1 | key1 | 01\tdata1 | 2019-xx-xx 
  2 | data2 | key2 | 02\tdata2 | 2019-xx-xx 

但是我不能用select语句选择那些数据

select * from table1,其中pid = 1 AND cid ='data1'AND key ='key1'AND value ='1 \ tdata1';

我应该逃脱'\ t'字符吗?

下面是表格方案

CREATE TABLE table1 (
    pid int,
    cid text,
    key text,
    value text,
    update_time timestamp,
    PRIMARY KEY (pid, cid, key, value)
)

cql和java插入数据之间有区别

我使用Mac OS,当我在Mac控制台上选择时,我可以看到“\ t”字符颜色不同

使用java插入数据

enter image description here

使用cql插入数据

enter image description here

database cassandra cql
2个回答
0
投票

你已经在其中一条评论中回答了自己,但对于后代我想解释一下发生了什么:

首先,您正在使用“cqlsh”工具来执行SELECT请求。该工具通过将不可打印的字符转换为传统的Unix表示(例如,参见“cat -v”)来尝试友好,因此例如在打印到“\ t”时将标签字符转换。但是存储在数据库中的实际字符是一个制表符(ASCII值为9的字符),而不是“\ t”。

第二件事是CQL本身不支持这些“转义”字符。像\ t或\ 011这样的东西在CQL中没有任何特殊含义,而“\ t”只是两个字符反斜杠和t!您需要使用查询字符串中的实际制表符。在Java代码(或其他现代语言)中,它很容易,您可以在字符串常量中使用\ t而Java(而不是Cassandra)会将其转换为该查询字符串中的实际选项卡。但是,如果您使用cqlsh进行查询,则没有人会为您执行此转换;您需要实际键入该选项卡。因为cqlsh对选项卡有特殊处理,所以需要使用control-V和tab,告诉cqlsh真正放置一个实际的选项卡。我看到你自己已经发现了这个解决方案。


-1
投票

你使用pid作为字符串,但这是一个整数 - 尝试下面的查询,它将工作 -

select * from table1,其中pid = 1 AND cid ='data1'AND key ='key1'AND value = '01 \ tdata1';

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.