SQL Server 2008 r2大小写表达式计算不正确

SQL Server 2008 r2大小写表达式计算不正确,sql,sql-server,sql-server-2008-r2,case,Sql,Sql Server,Sql Server 2008 R2,Case,我得到了下面的SQL语句,它不确定一个字段何时应该具有值“Y”。这是SQL SELECT A.BUSINESS_UNIT , A.WO_ID , A.WO_TASK_ID , A.ENS_TSK_CRT_VAL , (CASE WHEN A.ENS_TSK_CRT_V01 = 'Y' THEN B.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V01 , (CASE WHEN A.ENS_TSK_CRT_V02 = 'Y' THEN C.DESCR

我得到了下面的SQL语句,它不确定一个字段何时应该具有值“Y”。这是SQL

SELECT A.BUSINESS_UNIT 
 , A.WO_ID 
 , A.WO_TASK_ID 
 , A.ENS_TSK_CRT_VAL 
 , (CASE WHEN A.ENS_TSK_CRT_V01 = 'Y' THEN B.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V01  
 , (CASE WHEN A.ENS_TSK_CRT_V02 = 'Y' THEN C.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V02 
 , (CASE WHEN A.ENS_TSK_CRT_V03 = 'Y' THEN D.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V03  
 , (CASE WHEN A.ENS_TSK_CRT_V04 = 'Y' THEN E.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V04 
 , (CASE WHEN A.ENS_TSK_CRT_V05 = 'Y' THEN F.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V05 
 , (CASE WHEN A.ENS_TSK_CRT_V06 = 'Y' THEN G.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V06 
 , (CASE WHEN A.ENS_TSK_CRT_V07 = 'Y' THEN H.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V07 
 , (CASE WHEN A.ENS_TSK_CRT_V08 = 'Y' THEN I.DESCR ELSE ' ' END) AS ENS_TSK_CRT_V08 
 FROM PS_ENS_WM_TSKCR_VW A LEFT OUTER JOIN ( 
   SELECT A.BUSINESS_UNIT 
   , A.WO_TASK_ID 
   , C.DESCR 
   , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '01' ) B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND B.WO_ID = A.WO_ID 
      AND B.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '02' ) C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND C.WO_ID = A.WO_ID 
      AND C.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '03' ) D ON D.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND D.WO_ID = A.WO_ID 
      AND D.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '04' ) E ON E.BUSINESS_UNIT = A.BUSINESS_UNIT 
             AND E.WO_ID = A.WO_ID 
      AND E.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '05' ) F ON F.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND F.WO_ID = A.WO_ID 
      AND F.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '06' ) G ON G.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND G.WO_ID = A.WO_ID 
      AND G.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '07' ) H ON H.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND H.WO_ID = A.WO_ID 
      AND H.WO_TASK_ID = A.WO_TASK_ID LEFT OUTER JOIN ( 
    SELECT A.BUSINESS_UNIT 
    , A.WO_TASK_ID 
    , C.DESCR 
    , A.WO_ID 
    , C.ENS_TSK_CRT_CD 
     FROM PS_ENS_WM_TSKCR_VW A 
     , PS_ENS_WM_TSK_CRT C 
    WHERE A.ENS_TSK_CRT_V01 = 'Y' 
      AND C.SETID = 'SHARE' 
      AND C.ENS_TSK_CRT_CD = '08' ) I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT 
      AND I.WO_ID = A.WO_ID 
      AND I.WO_TASK_ID = A.WO_TASK_ID  
    WHERE ( A.ENS_TSK_CRT_VAL <> 0 
    AND A.WO_ID = '0000002151'
    AND A.BUSINESS_UNIT = 'R3851' )
此后,我采取了完全不同的方法解决了这个问题,但我只想知道这是如何发生的,以及将来再次使用CASE表达式时如何克服这个问题

非常感谢您的帮助

弗林
您可以尝试从Y中删除尾随空格,这可能会导致类似问题

这可能对您有所帮助-

;WITH cte AS 
(
    SELECT  A.BUSINESS_UNIT ,
            A.WO_TASK_ID ,
            C.DESCR ,
            A.WO_ID ,
            C.ENS_TSK_CRT_CD
    FROM PS_ENS_WM_TSKCR_VW A ,
         PS_ENS_WM_TSK_CRT C
    WHERE A.ENS_TSK_CRT_V01 = 'Y'
        AND C.SETID = 'SHARE'
        AND C.ENS_TSK_CRT_CD IN (
                    '01', '02', '03', '04', 
                    '05', '06', '07', '08'
                )
)
SELECT  A.BUSINESS_UNIT ,
        A.WO_ID ,
        A.WO_TASK_ID ,
        A.ENS_TSK_CRT_VAL ,
        ISNULL(B.DESCR, ' ') AS ENS_TSK_CRT_V01 ,
        ISNULL(C.DESCR, ' ') AS ENS_TSK_CRT_V02 ,
        ISNULL(D.DESCR, ' ') AS ENS_TSK_CRT_V03 ,
        ISNULL(E.DESCR, ' ') AS ENS_TSK_CRT_V04 ,
        ISNULL(F.DESCR, ' ') AS ENS_TSK_CRT_V05 ,
        ISNULL(G.DESCR, ' ') AS ENS_TSK_CRT_V06 ,
        ISNULL(H.DESCR, ' ') AS ENS_TSK_CRT_V07 ,
        ISNULL(I.DESCR, ' ') AS ENS_TSK_CRT_V08
FROM PS_ENS_WM_TSKCR_VW A
LEFT JOIN cte B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND B.WO_ID = A.WO_ID
    AND B.WO_TASK_ID = A.WO_TASK_ID
    AND B.ENS_TSK_CRT_CD = '01'
    AND A.ENS_TSK_CRT_V01 = 'Y'
LEFT JOIN cte C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND C.WO_ID = A.WO_ID
    AND C.WO_TASK_ID = A.WO_TASK_ID
    AND C.ENS_TSK_CRT_CD = '02'
    AND A.ENS_TSK_CRT_V02 = 'Y'
LEFT JOIN cte D ON D.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND D.WO_ID = A.WO_ID
    AND D.WO_TASK_ID = A.WO_TASK_ID
    AND D.ENS_TSK_CRT_CD = '03'
    AND A.ENS_TSK_CRT_V03 = 'Y'
LEFT JOIN cte E ON E.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND E.WO_ID = A.WO_ID
    AND E.WO_TASK_ID = A.WO_TASK_ID
    AND E.ENS_TSK_CRT_CD = '04'
    AND A.ENS_TSK_CRT_V04 = 'Y'
LEFT JOIN cte F ON F.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND F.WO_ID = A.WO_ID
    AND F.WO_TASK_ID = A.WO_TASK_ID
    AND F.ENS_TSK_CRT_CD = '05'
    AND A.ENS_TSK_CRT_V05 = 'Y'
LEFT JOIN cte G ON G.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND G.WO_ID = A.WO_ID
    AND G.WO_TASK_ID = A.WO_TASK_ID
    AND G.ENS_TSK_CRT_CD = '06'
    AND A.ENS_TSK_CRT_V06 = 'Y'
LEFT JOIN cte H ON H.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND H.WO_ID = A.WO_ID
    AND H.WO_TASK_ID = A.WO_TASK_ID
    AND H.ENS_TSK_CRT_CD = '07'
    AND A.ENS_TSK_CRT_V07 = 'Y'
LEFT JOIN cte I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT
    AND I.WO_ID = A.WO_ID
    AND I.WO_TASK_ID = A.WO_TASK_ID
    AND I.ENS_TSK_CRT_CD = '08'
    AND A.ENS_TSK_CRT_V08 = 'Y'
WHERE A.ENS_TSK_CRT_VAL != 0
    AND A.WO_ID = '0000002151'
    AND A.BUSINESS_UNIT = 'R3851'
顺便说一句,以防有人好奇,这是我在将关于案例表达的问题发布到原始问题之前使用的解决方法

SELECT A.BUSINESS_UNIT , A.WO_ID , A.WO_TASK_ID , A.ENS_TSK_CRT_VAL 
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,1) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 01 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL01
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,2) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 02 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL02
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,3) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 03 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL03
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,4) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 04 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL04
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,5) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 05 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL05
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,6) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 06 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL06
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,7) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 07 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL07
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,8) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 08 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL08
 FROM PS_ENS_WM_TSKCR_WO A 
WHERE A.ENS_TSK_CRT_VAL <> 0
AND A.WO_ID = '0000002151' AND A.BUSINESS_UNIT = 'R3851'

我怀疑这是案件陈述的行为。我刚刚发现了2008年R2和2005年的不同,在我的搜索中发现了你的问题。sql server处理该案例的方式不同于。请注意2008年文档备注中的语句:在某些情况下,在CASE语句接收表达式的结果作为其输入之前,会对表达式进行求值。计算这些表达式时可能会出错

因此,在2008年,所有潜在的输出都可能被评估,即使不合适,输入的评估结果也不是真的,这在我升级到2008年后的一些存储过程中发生

所以在你的例子中,不管B.DESCR,C.DESCR,D.DESCR等是否等于Y, B.DESCR、C.DESCR、D.DESCR等进行求值,此时可能为null,或者无法与“Y”进行比较,从而导致语句的该部分失败,这似乎是无声的。不确定,但闻起来和我遇到的问题一样。唯一让我对这个答案保持谨慎的是,我的问题在where子句中,而你的问题在sql语句的select部分


不管怎样,也许有人会觉得这很有帮助。要想弄明白这一点需要一些挖掘。

这个SQL看起来比它需要的更可怕。你确定你需要所有这些子查询吗?Abe,SQL是可靠的。我已经编写SQL很多年了,高级SQL使用了左外部连接,比如这样。如果您通读了它,您将看到,对于每一个输出的DESCR,需要将我外部连接到主表的表设置为一个特定的值。这是因为表结构。where子句使用AND C.ENS_TSK_CRT_CD='01'和C.ENS_TSK_CRT_CD='02'等行来处理每行的特定需要。@AbeMiessler是对的,我认为您不需要所有这些自联接。如果你发布PS_ENS_WM_Tskr_VW和PS_ENS_WM_TSK_CRT的模式,它可以作为数据透视查询重新编写,然后我也可以修复CASE语句。tommy_0,不,一点也不。当我将CASE表达式替换为用CASE表达式求值的8个字段时,SQL工作得非常好。我尝试了将'>'和'Devart'连接起来,这是您在其中编写的一段非常性感的SQL。我个人喜欢在工具适合问题时使用CTE,这绝对是一个很好的使用。我试过了,它很管用…所以感谢你的帮助:为了防止有人好奇,这是我在将关于案例表达式的问题发布到原始问题之前使用的解决方法。
SELECT A.BUSINESS_UNIT , A.WO_ID , A.WO_TASK_ID , A.ENS_TSK_CRT_VAL 
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,1) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 01 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL01
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,2) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 02 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL02
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,3) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 03 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL03
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,4) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 04 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL04
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,5) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 05 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL05
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,6) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 06 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL06
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,7) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 07 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL07
 , (CASE WHEN (CASE WHEN CAST(A.ENS_TSK_CRT_VAL AS INT) & POWER(2,8) > 0 THEN 1 ELSE 0 END) = 1 THEN (SELECT DESCR FROM PS_ENS_WM_TSK_CRT WHERE ENS_TSK_CRT_CD = 08 AND SETID = 'SHARE') ELSE ' ' END) AS ENS_TSK_CRT_VAL08
 FROM PS_ENS_WM_TSKCR_WO A 
WHERE A.ENS_TSK_CRT_VAL <> 0
AND A.WO_ID = '0000002151' AND A.BUSINESS_UNIT = 'R3851'