【问题标题】:CQL no viable alternative at input '(' errorCQL 在输入 '(' 错误时没有可行的替代方案
【发布时间】:2016-01-14 05:56:26
【问题描述】:

我的 CQL 有问题,cassandra 给了我no viable alternative at input '(' (...WHERE id = ? if [(]...) 错误消息。我觉得我的说法有问题。

UPDATE <TABLE> USING TTL 300 
  SET <attribute1> = 13381990-735b-11e5-9bed-2ae6d3dfc201
  WHERE <attribute2> = dfa2efb0-7247-11e5-a9e5-0242ac110003 
    IF (<attribute1> = null OR <attribute1> = 13381990-735b-11e5-9bed-2ae6d3dfc201) AND <attribute3> = 0; 

你知道问题在陈述中吗?

【问题讨论】:

    标签: cassandra cql database nosql


    【解决方案1】:

    拥有完整的表结构会有所帮助,因此为了测试您的陈述,我做了一些有根据的猜测。

    有了这张桌子:

    CREATE TABLE lwtTest (attribute1 timeuuid, attribute2 timeuuid PRIMARY KEY, attribute3 int);
    

    这个语句有效,只要我最后不添加轻量级事务:

    UPDATE lwttest USING TTL 300 SET attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201 
    WHERE attribute2=dfa2efb0-7247-11e5-a9e5-0242ac110003;
    

    您的轻量级交易...

    IF (attribute1=null OR attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201) AND attribute3 = 0;
    

    ...有一些问题。

    • Cassandra 中的“null”与其对应的 RDBMS 完全不同。并非每一行都需要对每一列都有一个值。那些没有表中某些列值的值的 CQL 行将显示“null”。但是您不能通过“null”进行查询,因为它实际上并不存在。
    • CQL 中不存在 OR 关键字。
    • 您不能使用额外的括号来分隔 WHERE 子句或轻量级事务中的条件。

    牢记这些要点,以下 UPDATE 和轻量级事务运行无误:

    UPDATE lwttest USING TTL 300 SET attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201 
    WHERE attribute2=dfa2efb0-7247-11e5-a9e5-0242ac110003
    IF attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201 AND attribute3=0;
    
     [applied]
    -----------
         False
    

    【讨论】:

    • 很好的答案!因此,我没有在文档中找到带有括号和 OR 条件的语句。
    • 关于 'null' 的信息也很有帮助,很值得了解,因为在 cql shell 中,您实际上会看到值 'null'。
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2022-11-04
    • 2013-01-31
    • 1970-01-01
    • 2013-08-26
    • 2013-01-23
    相关资源
    最近更新 更多