【问题标题】:Why doesn't IN operator work on the result returned by subquery ?为什么 IN 运算符对子查询返回的结果不起作用?
【发布时间】:2017-06-05 09:44:27
【问题描述】:

为什么运算符不工作,即什么也不返回?

Select * from complaints where Code 
IN 
(select
   distinct  
    stuff((
        select ',' + QUOTENAME(cs.Code,'''')
        from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1
        order by cs.Code asc
        for xml path('')
    ),1,1,'') as codeslist
from MC_Complaints.dbo.Complaints cs)

这个查询

select
   distinct  
    stuff((
        select ',' + QUOTENAME(cs.Code,'''')
        from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1
        order by cs.Code asc
        for xml path('')
    ),1,1,'') as codeslist
from MC_Complaints.dbo.Complaints cs

返回

'LG/17/05/0','LG/17/05/2','LG/17/05/3','Local Council Board/17/05/1','Local Council Board/17/05/10','Local Council Board/17/05/11'

但是 IN 没有选择任何记录,但是当我将这些代码放在 IN 运算符中时,即

Select * from complaints where Code in 
(
    'LG/17/05/0','LG/17/05/2','LG/17/05/3','Local Council Board/17/05/1','Local Council Board/17/05/10','Local Council Board/17/05/11'
)

然后它会令人惊讶地工作,但不是在返回时而是在子查询中。为什么 ?

【问题讨论】:

  • 一个包含引号字符和逗号的字符串与多个用逗号分隔的字符串不同。与大多数其他编程语言一样,在 T-SQL 中也是如此。你为什么要做DISTINCT 并转换为这个字符串 - IN 支持直接有一个子查询。
  • 即看起来您的整个查询可能只是 Select * from complaints where Code in (select Code from MC_Complaints.dbo.Complaints where cs.OverDue= 1)

标签: sql sql-server sql-server-2008 tsql subquery


【解决方案1】:

stuff() 的结果是一个字符串。仅仅因为字符串恰好包含逗号并不意味着它是一个值列表。字符串'A,B,C' 与列表'A', 'B', 'C' 完全不同。

好消息是这可以大大简化您的逻辑:

Select c.*
from complaints c
where c.code in (select cs.Code
                 from MC_Complaints.dbo.Complaints cs
                 where cs.OverDue = 1
                );

还有两点。首先,您的 in 表达式后跟一个列别名 (codelist)。这是不允许的语法。

其次,相关的比较是:

where cCode in (
    '''LG/17/05/0'',''LG/17/05/2'',''LG/17/05/3'',''Local Council Board/17/05/1'',''Local Council Board/17/05/10'',''Local Council Board/17/05/11'''
      )

这是一个具有单个字符串值的in 列表。

【讨论】:

  • 您能分享一下在 IN 子句中使用双引号而不是单引号的原因吗?
  • @AnkitBajpai 。 . .我试图指出该值不是单个字符串。
  • 但我认为可以改写为where cCode in ( 'LG/17/05/0','LG/17/05/2','LG/17/05/3','Local Council Board/17/05/1','Local Council Board/17/05/10','Local Council Board/17/05/11'),这与您的建议相同。
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2022-08-18
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
相关资源
最近更新 更多