我正在研究一个函数来比较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是空白的,但事实并非如此。
如何调整代码以解决此问题?
答案 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)