如何在Cassandra cql中使用条件选择语句使用某些数据,包括字符“ \ t”

时间:2019-02-27 07:17:23

标签: database cassandra cql

我使用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语句选择该数据

从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

2 个答案:

答案 0 :(得分: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 :(得分:-1)

您使用pid作为字符串,但这是一个整数-请尝试以下查询,它将起作用-

从table1中选择*,其中pid = 1 AND cid ='data1'AND key ='key1'AND value = '01 \ tdata1';

enter image description here