为什么 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 ?
我正在尝试在 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 ?