我从以前的应用程序继承了以下查询。我很难理解“选择”和“何处”条款中的“案例”。
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)上运行此查询
答案 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。不确定那条线的用途是什么,但我仍然认为是从测试/调试中得到的,并没有取出查询。