我试图执行一个SELECT
查询包含与卡桑德拉2.0的C#CQL驾驶员IN
条款。
我有一个简单的表,看起来像
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
。它可能有一些做长期的元组,但那些只是存在于卡桑德拉2.1。
根据CQL的语法,使用操作者IN
后跟括号和查询标记?
时,卡桑德拉期望的参数的固定量。
以下查询预计2个参数类型相同的密钥。
SELECT * FROM tbl1 WHERE key IN (?, ?)
下面的查询期望的类型相同密钥的1个参数。
SELECT * FROM tbl1 WHERE key IN (?)
在另一方面,操作者随后是单个查询标记?,预计含有可变长度的值的列表中的参数。
以下查询预计1个参数,相同类型的键的值的列表:
SELECT * FROM tbl1 WHERE key IN ?