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

问题描述 投票:0回答:1

我试图执行一个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。

c# cassandra cql
1个回答
4
投票

根据CQL的语法,使用操作者IN后跟括号和查询标记?时,卡桑德拉期望的参数的固定量。

以下查询预计2个参数类型相同的密钥。

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

下面的查询期望的类型相同密钥的1个参数。

SELECT * FROM tbl1 WHERE key IN (?)

在另一方面,操作者随后是单个查询标记?,预计含有可变长度的值的列表中的参数。

以下查询预计1个参数,相同类型的键的值的列表:

SELECT * FROM tbl1 WHERE key IN ?
© www.soinside.com 2019 - 2024. All rights reserved.