比较不同

时间:2017-06-27 15:25:30

标签: sql sql-server sql-server-2008

我正在研究一个函数来比较2-3个值并返回一个yes / no(bit)来基于一个insert语句。我的问题是偶尔第3个值返回为“空白”而不是空值。我不知道如何在下面的陈述中说明这一点

DECLARE @var1 VARCHAR(255)
DECLARE @var2 VARCHAR(255)
DECLARE @var3 VARCHAR(255)

SET @var1 ='test'
SET @var2 = 'test'
SET @var3 = ''

SELECT @var1, @var2, @var3

SELECT CAST(CASE
     WHEN COUNT(DISTINCT C) = 1 THEN 1
     ELSE 0
   END AS BIT)
FROM   (VALUES (@var1),
           (@var2),
           (@var3)) t (C)  

因此对于上面的例子,我希望返回一个“1”,因为@ var3是空白的,但事实并非如此。

如何调整代码以解决此问题?

3 个答案:

答案 0 :(得分:1)

您可以简单地从比较中排除空值:

WHERE t.C != ''

完整:

DECLARE @var1 VARCHAR(255)
DECLARE @var2 VARCHAR(255)
DECLARE @var3 VARCHAR(255)

SET @var1 ='test'
SET @var2 = 'test'
SET @var3 = ''

SELECT @var1, @var2, @var3

SELECT CAST(CASE
     WHEN COUNT(DISTINCT C) = 1 THEN 1
     ELSE 0
   END AS BIT)
FROM   (VALUES (@var1),
           (@var2),
           (@var3)) t (C)  
WHERE t.C != ''

答案 1 :(得分:1)

使用NULLIF将空字符串转换为NULL 顺便说一句,不久之前我已经了解了sql中的SIGN内置函数。这可以缩短您的查询:

SELECT SIGN(COUNT(DISTINCT C))
FROM (VALUES 
    (NULLIF(@Var1, '')),
    (NULLIF(@Var2, '')),
    (NULLIF(@Var3, ''))) t(C)

答案 2 :(得分:0)

我添加了这个:它解决了它

if (len(@var2) = 0)
set @var2 = NULL
if (len(@var3) = 0)
set @var3 = null

最终代码如下:

 DECLARE @var1 VARCHAR(255)
 DECLARE @var2 VARCHAR(255)
 DECLARE @var3 VARCHAR(255)

 SET @var1 ='test'
 SET @var2 = ''
  SET @var3 = 'test'

SELECT @var1, @var2, @var3

if (len(@var2) = 0)
set @var2 = NULL
if (len(@var3) = 0)
set @var3 = null

SELECT CAST(CASE
     WHEN COUNT(DISTINCT C) = 1 THEN 1
     ELSE 0
   END AS BIT)
FROM   (VALUES (@var1),
           (@var2),
           (@var3)) t (C)