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

时间:2015-03-03 20:54:55

标签: c# cassandra cql

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

我有一个看起来像

的简单表
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"));
}

并打印表格中的单行。

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

SELECT * FROM tbl1 WHERE key IN (?)

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

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

SELECT * FROM tbl1 WHERE key IN ?