为什么 IN 子句中的括号会影响 SELECT 查询的结果?

Why do parentheses in an IN clause affect the result of a SELECT query?

我正在尝试在 Cassandra 2.0 上使用 C# CQL 驱动程序执行一个 SELECT 查询,其中包含一个 IN 子句。

我有一个简单的 table 看起来像

CREATE TABLE test.in_clause (key_val text PRIMARY KEY);

只有一个值

INSERT INTO test.in_clause (key_val) VALUES ("some value");

然后我可以使用 PreparedStatement 来执行我的查询。

Cluster cluster = Cluster.Builder().AddContactPoint("localhost").WithPort(9048).Build();
ISession session = cluster.Connect("test");
var ps = session.Prepare("SELECT * FROM in_clause WHERE key_val IN ?");
var list = new List<string>() { "some value", "something", "else" };
var bs = ps.Bind(list);
var rs = session.Execute(bs);
foreach (var row in rs.GetRows()) {
    Console.WriteLine(row.GetValue<string>("key_val"));
}

这将打印 table 中的单行。

但是,如果我在绑定占位符 ? 周围添加括号 (),则找不到任何结果。也就是说,如果我使用

var ps = session.Prepare("SELECT * FROM in_clause WHERE key_val IN (?)");
//                                                      these guys: ^ ^

ISession.Execute 返回的 RowSet 不包含任何行。为什么会这样?

我不确定如何解释 CQL documentation for SELECT 中的红色括号,这可能解释了这种行为。它可能与术语元组有关,但这些仅存在于 Cassandra 2.1 中。

根据 CQL 语法,当使用 IN 运算符后跟圆括号和查询标记 ? 时,Cassandra 需要 固定 数量的参数。

以下查询需要 2 个与键类型相同的参数。

SELECT * FROM tbl1 WHERE key IN (?, ?)

以下查询需要 1 个与键类型相同的参数。

SELECT * FROM tbl1 WHERE key IN (?)

另一方面,运算符 IN 后跟一个查询标记 ?,需要一个包含 可变长度值列表的参数

以下查询需要 1 个参数,即与键类型相同的值列表:

SELECT * FROM tbl1 WHERE key IN ?