将0替换为null并清空

时间:2015-05-26 08:20:44

标签: sql sql-server

这是我的查询。@ ScoreCount可能包含零或不包含。如果它包含零,则应考虑零,以及空和空字符。如何做?

declare @ScoreCount
set @ScoreCount = '2,5,0'
select * from tblEmployee where ScoreCount in (@ScoreCount)

3 个答案:

答案 0 :(得分:1)

在我为您的问题提供可能的解决方案之前,我必须重申其他人已经提出的几点:

  1. 您无法将变量中的分隔列表传递给IN子句
  2. 您表格中的ScoreCount 的数据类型是什么?让我们假设它是一个int,因为这是有道理的。
  3. 所以无论如何,假设你正在创建一个存储过程,这里有几个解决方案:

    1. 问题的最佳解决方案是使用表类型变量,如下面的答案:How to pass table value parameters to stored procedure from .net code 请参阅最受欢迎的答案,而不是接受的答案。
    2. 如果你从.Net调用proc,这很好,但是其他环境可能不支持表类型参数,在这种情况下你可以执行以下操作:

      /* Example values - assume @ScoreCount will ultimately be passed in from caller */
      declare @ScoreCount varchar(200)
      set @ScoreCount = '2,5,0'
      /* */
      
      /* 1. Treat null and empty values as zero */
      if IsNull(@ScoreCount, '') = '' SET @ScoreCount = '0'
      
      /* 2. Ensure @ScoreCount starts and ends with comma */
      SET @ScoreCount = ',' + @ScoreCount + ','
      
      select * from tblEmployee where @ScoreCount LIKE '%,' + Convert(varchar, ScoreCount) + ',%'
      

      这样做是比较表中的每个ScoreCount值,看它是否像逗号分隔列表一样。例如对于它将执行的每一行:

      select * from tblEmployee where ',2,5,0,' LIKE '%,2,%'   -- True, return this row
      select * from tblEmployee where ',2,5,0,' LIKE '%,42,%'  -- false, do not return this row 
      select * from tblEmployee where ',2,5,0,' LIKE '%,0,%'   -- True, return this row
      ... etc for each row.
      

      请注意,评论" 2"我们在@ScoreCount之前添加和附加逗号,以确保只匹配整数,因为我们将这些数字作为字符串进行比较。

      另请注意,这不是一个有效的查询,因此对于大型表来说速度不快!

答案 1 :(得分:0)

首先,您需要使用int值解析变量@ScoreCount,例如在某个临时表中,然后使用临时表从tblEmployee进行选择。

答案 2 :(得分:0)

首先你的询问是这样问:

select * from tblEmployee where ScoreCount in ('2,5,0');

因此只找到ScoreCount与这一个字符串匹配的记录(与ScoreCount = '2,5,0'相同)。

然后,ScoreCount包含字符串(你说varchar(200))很奇怪。那么你期望在那个领域做什么?像这样的字符串:'2','5','0','',null,'two','more then 4'?对我而言,您似乎使用了错误的数据类型,这就是您现在遇到问题的原因。

但是,为了找到'2','5','0','',null,'2'和'5',请使用:

select * from tblEmployee where isnull(nullif(trim(ScoreCount), ''), 0) in (2, 5, 0);