我尝试在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中。
答案 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 ?