SQL Server CASE 1 WHEN 1,WHERE 1 = 1 AND 1 = 1

时间:2014-02-18 06:16:41

标签: sql-server

我从以前的应用程序继承了以下查询。我很难理解“选择”和“何处”条款中的“案例”。

SELECT J1.AC_CODE, J1.PERIOD, J1.JRNAL_NO, J1.DESCRIPTN, - J1.AMOUNT ,
                                                              J1.ANAL_T3,
                                                              CASE 1
                                                                  WHEN 1 THEN 'A'
                                                                  ELSE J1.ACCNT_CODE
                                                              END ,
                                                              J1.JRNAL_LINE
FROM dbo.JSource J1
WHERE 1=1
  AND 1=1
  AND NOT ('A' LIKE '%Z%'
           AND J1.JRNAL_SRCE IN ('B/F',
                                 'CLRDN')
           AND J1.JRNAL_NO = 0)
  AND CASE 1
          WHEN 1 THEN 'A'
          ELSE J1.AC_CODE
      END ='A'
  AND J1.AC_CODE='156320'
  AND J1.PERIOD BETWEEN 2014001 AND 2014012
  AND J1.ANAL_T3='ANAL001'
ORDER BY 1,2,3,4,5,6,7,8

我不确定我是否理解以下条款:

第一条:

CASE 1
 WHEN 1 THEN 'A'
 ELSE J1.AC_CODE
END
  

我理解为:如果第1列为真,则选择文字A或者选择J1.AC_CODE。

第二条:

WHERE 1=1
  AND 1=1
  AND NOT ('A' LIKE '%Z%'
           AND J1.JRNAL_SRCE IN ('B/F',
                                 'CLRDN')
           AND J1.JRNAL_NO = 0)
  AND CASE 1
          WHEN 1 THEN 'A'
          ELSE J1.AC_CODE
      END ='A'
  AND J1.AC_CODE='156320'
  AND J1.PERIOD BETWEEN 2014001 AND 2014012
  AND J1.ANAL_T3='ANAL001'
  

我完全迷失了这个“Where”条款。

您能帮助解释一下这个查询并为整个查询编写更好的版本吗? 我在SQL Server 2008(R2)上运行此查询

2 个答案:

答案 0 :(得分:7)

  

我理解为:如果第1列为真,则选择文字A或者   选择J1.AC_CODE。

不,它将值1与值1进行比较,如果为真,则返回A,并且当然总是如此,因此case语句将始终为返回A

你的where子句根本不做任何事情。

1=1
  AND 1=1

将始终为true且大小写将始终为true,'A' LIKE '%Z%'将始终为false,这使得整个AND NOT 'A' LIKE '%Z%' ....表达式始终为true。

您查询的简单版本将如下所示。

SELECT J1.AC_CODE,
       J1.PERIOD,
       J1.JRNAL_NO,
       J1.DESCRIPTN, 
       - J1.AMOUNT,
       J1.ANAL_T3,
       'A',
       J1.JRNAL_LINE
FROM dbo.JSource J1
WHERE J1.AC_CODE='156320' AND 
      J1.PERIOD BETWEEN 2014001 AND 2014012 AND
      J1.ANAL_T3='ANAL001'
ORDER BY 1,2,3,4,5,6,7,8

答案 1 :(得分:1)

在不知道此查询的历史记录的情况下,我猜测这是在编写测​​试/调试的时候编写的,其中一些代码已经存在。选择行中的case语句可以(并且我可以重复,因为这是我从查询中看到的猜测)在创建用于测试的查询期间有其他with子句,这些可以通过更改之后的值来切换。 CASE(示例SELECT ..... CASE 1 WHEN 1'EN'An'2 THEN''some value'WHEN 3'a some other value'ELSE J1.ACCNT_CODE)。

至于1 = 1,我在查询创建/测试期间看到过这种情况 - 主要是因为它意味着每个真实条件都可以很容易地被评论/取消注释或剪切。作为第一个条件始终为真的粘贴。我之前没见过AND 1 = 1。不确定那条线的用途是什么,但我仍然认为是从测试/调试中得到的,并没有取出查询。