如何在 WHERE 子句中使用带有 IN 运算符的值列表?
How can I use a list of values with the IN operator in a WHERE clause?
我正在尝试使用 JavaScript 驱动程序执行这样的查询:
client.execute('SELECT * FROM zhos_dev.jw_testing WHERE a IN ?', [['foo', 'foo1']], {prepare: true})
它给了我:ResponseError: line 0:-1 mismatched input '<EOF>' expecting ')'
。
我的版本是:[cqlsh 3.1.8 | Cassandra 1.2.19 | CQL spec 3.0.5 | Thrift protocol 19.36.2]
已创建 table 并填充了以下 CQL:
CREATE TABLE zhos_dev.jw_testing (a text PRIMARY KEY, b text);
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo', 'bar');
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo1', 'bar1');
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo2', 'bar2');
这个问题在 FAQ 中,但不在实际调用的文档中,而且我在 Whosebug 上不容易找到它,所以我想我应该把它复制到这里:
use the IN operator followed by the question mark placeholder without parenthesis in the query. The parameter containing the list of values should be of an instance of Array.
我在同一版本中复制了这个:
[cqlsh 3.1.8 |卡桑德拉 1.2.19 | CQL 规范 3.0.5 |节俭协议 19.36.2]
name: 'ResponseError',
info: 'Represents an error message from the server',
message: "line 0:-1 mismatched input '<EOF>' expecting ')'",
code: 8192,
query: 'SELECT name, color FROM keyspace1.dresses WHERE id IN ?'
"IN" 子句早在 Cassandra 2.1 就可以正常工作:
[cqlsh 5.0.1 |卡桑德拉 2.1.21 | CQL 规范 3.2.1 |本机协议 v3]
Connected to cluster with 1 host(s): ["127.0.0.1:9042"]
Azul Dress
测试table/data:
CREATE KEYSPACE keyspace1 WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1 };
CREATE TABLE keyspace1.dresses (id text, color text, name text, size int, PRIMARY KEY (id, color));
insert into dresses (id, color, name, size) values ('mon1', 'blue', 'Blue Dress', 12);
insert into dresses (id, color, name, size) values ('mon2', 'blue', 'Azul Dress', 12);
insert into dresses (id, color, name, size) values ('can1', 'green', 'Green Dress', 12);
insert into dresses (id, color, name, size) values ('can2', 'verde', 'Verde Dress', 12);
和代码:
const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['127.0.0.1'], localDataCenter: 'datacenter1' });
client.connect(function (err) {
if (err) return console.error(err);
console.log('Connected to cluster with %d host(s): %j', client.hosts.length, client.hosts.keys());
});
client.execute('SELECT name, color FROM keyspace1.dresses WHERE id IN ?', [ ['mon2'] ],
{ prepare: true},
function (err, result) {
if (err) return console.error(err);
const row = result.first();
console.log(row['name']);
});
由于 node.js 驱动程序仅在 Cassandra 2.1 及更高版本 (https://docs.datastax.com/en/developer/nodejs-driver/4.1/faq/#which-versions-of-cassandra-does-the-driver-support) 中受支持,我认为 Cassandra 或驱动程序项目不会接受错误请求。你能至少升级到 2.1 吗?
我正在尝试使用 JavaScript 驱动程序执行这样的查询:
client.execute('SELECT * FROM zhos_dev.jw_testing WHERE a IN ?', [['foo', 'foo1']], {prepare: true})
它给了我:ResponseError: line 0:-1 mismatched input '<EOF>' expecting ')'
。
我的版本是:[cqlsh 3.1.8 | Cassandra 1.2.19 | CQL spec 3.0.5 | Thrift protocol 19.36.2]
已创建 table 并填充了以下 CQL:
CREATE TABLE zhos_dev.jw_testing (a text PRIMARY KEY, b text);
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo', 'bar');
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo1', 'bar1');
INSERT INTO zhos_dev.jw_testing (a, b) VALUES ('foo2', 'bar2');
这个问题在 FAQ 中,但不在实际调用的文档中,而且我在 Whosebug 上不容易找到它,所以我想我应该把它复制到这里:
use the IN operator followed by the question mark placeholder without parenthesis in the query. The parameter containing the list of values should be of an instance of Array.
我在同一版本中复制了这个: [cqlsh 3.1.8 |卡桑德拉 1.2.19 | CQL 规范 3.0.5 |节俭协议 19.36.2]
name: 'ResponseError',
info: 'Represents an error message from the server',
message: "line 0:-1 mismatched input '<EOF>' expecting ')'",
code: 8192,
query: 'SELECT name, color FROM keyspace1.dresses WHERE id IN ?'
"IN" 子句早在 Cassandra 2.1 就可以正常工作: [cqlsh 5.0.1 |卡桑德拉 2.1.21 | CQL 规范 3.2.1 |本机协议 v3]
Connected to cluster with 1 host(s): ["127.0.0.1:9042"]
Azul Dress
测试table/data:
CREATE KEYSPACE keyspace1 WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1 };
CREATE TABLE keyspace1.dresses (id text, color text, name text, size int, PRIMARY KEY (id, color));
insert into dresses (id, color, name, size) values ('mon1', 'blue', 'Blue Dress', 12);
insert into dresses (id, color, name, size) values ('mon2', 'blue', 'Azul Dress', 12);
insert into dresses (id, color, name, size) values ('can1', 'green', 'Green Dress', 12);
insert into dresses (id, color, name, size) values ('can2', 'verde', 'Verde Dress', 12);
和代码:
const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['127.0.0.1'], localDataCenter: 'datacenter1' });
client.connect(function (err) {
if (err) return console.error(err);
console.log('Connected to cluster with %d host(s): %j', client.hosts.length, client.hosts.keys());
});
client.execute('SELECT name, color FROM keyspace1.dresses WHERE id IN ?', [ ['mon2'] ],
{ prepare: true},
function (err, result) {
if (err) return console.error(err);
const row = result.first();
console.log(row['name']);
});
由于 node.js 驱动程序仅在 Cassandra 2.1 及更高版本 (https://docs.datastax.com/en/developer/nodejs-driver/4.1/faq/#which-versions-of-cassandra-does-the-driver-support) 中受支持,我认为 Cassandra 或驱动程序项目不会接受错误请求。你能至少升级到 2.1 吗?