Как использовать оператор выбора условия некоторые данные, включая символ "\ t" в Cassandra CQL - PullRequest
0 голосов
/ 27 февраля 2019

Я вставляю данные в таблицу Cassandra, используя библиотеку datastax и инфраструктуру Spring.

Я использую символ-разделитель "\ 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

введите описание изображения здесь

вставленные данные, используя cql

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы уже ответили себе в одном из комментариев, но для потомков я хочу объяснить, что происходит:

Во-первых, вы используете инструмент "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 действительно поместил реальную вкладку.Я вижу, вы уже обнаружили это решение самостоятельно.

0 голосов
/ 27 февраля 2019

Вы используете pid в качестве строки, но это целое число - попробуйте ниже запрос, и он будет работать -

select * from table1, где pid = 1 AND cid = 'data1' AND key = 'key1' ANDзначение = '01 \ tdata1 ';

enter image description here

...