Sybase 进程抛出 "Incorrect syntax near '='"
Sybase proc throws "Incorrect syntax near '='"
我正在开发的存储过程中有以下 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
)
我遇到 Incorrect syntax near '='
错误。为什么它会抱怨第一个等号?如果有人感兴趣的话,它是一个 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')
)
如果你想让 case 语句为此工作,以下可能是一个可能的解决方案。
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 中尝试类似的操作并查看结果 returns?关键是,提取失败的部分并对其进行测试,看看您是否能准确找出问题所在。可能是 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
This returns a 1 since miller = 'C' 用它来检查 mtime = 2 是否为真,这意味着 Mysql 中的 1 或真。
您可以尝试在 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
)
我遇到 Incorrect syntax near '='
错误。为什么它会抱怨第一个等号?如果有人感兴趣的话,它是一个 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') )
如果你想让 case 语句为此工作,以下可能是一个可能的解决方案。
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 中尝试类似的操作并查看结果 returns?关键是,提取失败的部分并对其进行测试,看看您是否能准确找出问题所在。可能是 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
This returns a 1 since miller = 'C' 用它来检查 mtime = 2 是否为真,这意味着 Mysql 中的 1 或真。
您可以尝试在 Sybase 中像这样隔离这段代码吗?