Sql Sybase进程抛出;靠近'的语法不正确='&引用;
在我正在开发的存储过程中,我有以下一段SELECT查询: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 ) 我
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进行比较,则可以执行以下任一操作
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
,我并不奇怪这是可行的。显然,和
子句中有一些限制和内容。