【问题标题】:Apache Cassandra "no viable alternative at input 'OR' "Apache Cassandra“在输入‘或’时没有可行的替代方案”
【发布时间】:2021-07-01 02:17:39
【问题描述】:

我的桌子看起来像:

CREATE TABLE prod_cust (
    pid bigint,
    cid bigint,
    effective_date date,
    expiry_date date,
    PRIMARY KEY ((pid, cid))
);

我的以下查询在输入“或”错误时没有给出可行的选择

SELECT * FROM prod_cust 
where 
pid=101 and cid=201 
OR 
pid=102 and cid=202;

如果不支持,Cassandra 是否不支持 OR 运算符,是否有任何替代方法可以实现我的结果。

【问题讨论】:

  • 撇开语法不谈,条件不明确。你的意思是(pid=101 and cid=201) OR (pid=102 and cid=202)?或者你的意思是id=101 and (cid=201 OR pid=102) and cid=202?您可能想要前者。当 andor 在这样的复合条件下完全使用时,你知道它很可能是错误的。
  • 前一个,我也试过了,它给出了错误:mismatched input 'and' Expecting ')' (... where (pid = 101 [and] cid...)跨度>
  • @ernest_k 同样的条件适用于我的 RDBMS 表,因为我正在迁移到 cassandra,所以我也希望这里有同样的行为。有什么解决方法吗?
  • 由于分区键是 2 个值的组合,因此它们有可能被组合成一个值——此时 OR 因为可能通过 IN。对该表的所有访问(允许过滤之外)都将使用 PID 和 CID,因此如果它们可以组合成一个值 - 您可以选择。

标签: cassandra cassandra-3.0


【解决方案1】:

CQL 不支持OR 运算符。有时您可以使用IN 来解决这个问题。但即使IN 也不会让你做你想做的事。

我看到两个选项:

  • OR 的每一面作为单独的查询提交。
  • 重组表格以更好地适应您想要做的事情。从 RDBMS 到 Cassandra 的“移植”几乎无法按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多