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 进行比较,您可以执行以下任一操作

  1. 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')
    )
    
  2. 如果你想让 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 中像这样隔离这段代码吗?