Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Sybase进程抛出;靠近'的语法不正确='&引用;_Sql_Syntax_Syntax Error_Sybase - Fatal编程技术网

Sql Sybase进程抛出;靠近'的语法不正确='&引用;

Sql Sybase进程抛出;靠近'的语法不正确='&引用;,sql,syntax,syntax-error,sybase,Sql,Syntax,Syntax Error,Sybase,在我正在开发的存储过程中,我有以下一段SELECT查询: AND ( CASE S.SWITCH WHEN 'A' THEN P.TEST = T.OPTION_1 WHEN 'C' THEN P.TEST = T.OPTION_1 + T.OPTION_2 WHEN 'G' THEN P.TEST = T.OPTION_3 WHEN 'N' THEN TRUE ELSE FALSE END ) 我

在我正在开发的存储过程中,我有以下一段SELECT查询:

AND (
    CASE S.SWITCH
        WHEN 'A' THEN P.TEST = T.OPTION_1
        WHEN 'C' THEN P.TEST = T.OPTION_1 + T.OPTION_2
        WHEN 'G' THEN P.TEST = T.OPTION_3
        WHEN 'N' THEN TRUE
        ELSE FALSE
    END
)

我在“=”附近得到了一个
错误语法
错误。为什么它会抱怨第一个等号?如果有人感兴趣,它就是Sybase服务器。

如果您正在测试基于
s.SWITCH
案例的
p.TEST
值,那么案例比较应该如下所示

AND (
    P.TEST = 
    CASE 
        WHEN S.SWITCH = 'A' THEN T.OPTION_1
        WHEN S.SWITCH =  'C' THEN T.OPTION_1 + T.OPTION_2
        WHEN S.SWITCH = 'G' THEN T.OPTION_3
        WHEN S.SWITCH = 'N' THEN TRUE
        ELSE FALSE
    END
)
如果您是基于p.TEST和S.SWITCH进行比较,则可以执行以下任一操作

  • Blorgbeard已经给出了这个答案

    AND
    (        
        (S.SWITCH = 'A' AND P.TEST = T.OPTION_1) OR
        (S.SWITCH = 'C' AND T.OPTION_1 + T.OPTION_2) OR
        (S.SWITCH = 'G' AND P.TEST = T.OPTION_3) OR
        (S.SWITCH = 'N')
    )
    
  • 如果您想让案例陈述对此起作用,下面可能是一个可能的解决方案

    AND (
      CASE 1 = 
        WHEN S.SWITCH = 'A' AND P.TEST = T.OPTION_1 THEN 1
        WHEN S.SWITCH =  'C' AND P.TEST = T.OPTION_1 + T.OPTION_2 THEN 1
        WHEN S.SWITCH = 'G' AND P.TEST = T.OPTION_3 THEN 1
        WHEN S.SWITCH = 'N' THEN 1
        ELSE 0
      END
    )
    

  • 布尔表达式在SQL中不是这样工作的。您可以按如下方式重新设置开关:

    AND (
        (S.SWITCH = 'A' AND P.TEST = T.OPTION_1) OR
        (S.SWITCH = 'C' AND T.OPTION_1 + T.OPTION_2) OR
        (S.SWITCH = 'G' AND P.TEST = T.OPTION_3) OR
        (S.SWITCH = 'N')
    )
    

    我知道这更多的是一个评论而不是一个答案,但希望这将导致一个答案,我需要为此编写格式化代码,所以… 我在Mysql中尝试了这个方法,效果很好。你能在Sybase中尝试一下这样的东西,看看它有什么回报吗?关键是,提取出失败的部分并进行测试,看看是否能够准确地找出错误所在。可能是Sybase指向了那个等号,但真正让它困惑的是别的东西

    set @miller:='C';
    set @mtime:=2;
    select CASE @miller
        WHEN 'A' THEN @mtime = 1
        WHEN 'C' THEN @mtime = 2
        WHEN 'G' THEN @mtime = 3
        WHEN 'N' THEN TRUE
        ELSE FALSE
        END
    
    这将返回一个1,因为miller='C'将它用于检查mtime=2,这是真的,这意味着在Mysql中是1还是真的。
    您能试着在Sybase中像这样隔离这段代码吗?

    这是一个更新查询还是什么?也许
    然后设置…
    ?这个线程可能会帮助您:一件有趣的事情,您这里的表达式在Mysql中运行良好。这可能是Sybase实现case表达式时出现的问题。我不是在反对Sybase或推广Mysql,所有db系统都有自己的怪癖。我只是觉得这可能是一个有用的数据。@GiliusMaximus是的,我们希望切换到MySQL,但我们避免了移动,因为我们必须迁移大量数据。我注意到在sybase中,赋值运算符和相等比较运算符是相同的(“=”)。在这种情况下,在and子句和case表达式中结合使用此选项可能会导致解析器将视为赋值运算符。您是否尝试过将表达式括在括号中,如(p.test=t.option_1)。这应该不会有什么不同,但这是一种小事情,有时会使解析器出错。我知道这个解决方案。我希望用这个案例来澄清问题。你能告诉我为什么这个案例在这种情况下不起作用的文档吗?对不起,我没有参考资料。我怀疑这是因为WHERE子句需要谓词(表达式运算符表达式),而不是裸表达式。我希望我能相信这一点,但我已经尝试将
    TRUE=
    粘贴在
    大小写
    表达式前面,但仍然会出错。这应该包括你所描述的,是吗?很有趣。。我不确定
    TRUE
    关键字的状态是什么,而且我实际上没有一个sybase数据库要测试。
    WHERE TRUE
    是否工作并返回所有行?怎么样
    其中TRUE=TRUE
    ?很吸引人。我在前面添加了一个简单的
    SELECT
    其中TRUE
    抛出错误:
    靠近“TRUE”的语法不正确
    ;并且
    其中TRUE=TRUE
    抛出一个错误:
    无效的列名“TRUE”
    。但是,
    其中1=1
    起作用。我想我会尝试搜索binary第二个建议的
    案例
    版本,但这可能会失去我想要的可读性,因此
    可能是最好的方法。这是将
    P.TEST
    TRUE
    FALSE
    进行比较,与其只是计算为
    TRUE
    FALSE
    ,我并不奇怪这是可行的。显然,
    子句中有一些限制和内容。