我有这个sql,
IF(@ID = '')
BEGIN
SET @ID = NULL;
END
IF(@Name = '')
BEGIN
SET @Name = NULL;
END
IF(@PhoneNumber = '')
BEGIN
SET @PhoneNumber = NULL;
END
IF(@Price = '')
BEGIN
SET @Price = NULL;
END
IF(@NewPrice = '')
BEGIN
SET @NewPrice = NULL;
END
IF(@ModelNumber = '')
BEGIN
SET @ModelNumber = NULL;
END
IF(@SKU = '')
BEGIN
SET @SKU = NULL;
END
我正在查找类似ISNULL的IsEmpty函数。这样我就可以了,
ISEMPTY(@SKU, NULL)
这在SQL中可能吗。
按以下尝试NULLIF
NULLIF(@SKU,'')
请尝试:
SET @YourValue=ISNULL(NULLIF(@YourValue,' '), NULL)
如果值为NULL、空或空格,则返回NULL。
注:如果两个表达式不等价,则NULLIF
返回第一个表达式。如果表达式是等效的,则NULLIF
返回第一个表达式类型的空值。
使用SET @SKU = NULLIF(@SKU,'')
将@SKU设置为null,其中@SKU等于第二个参数的值。
IsEmpty
不是一个内置的t-SQL函数,但NULLIF
可以用于实现类似的行为。
这可能就是您想要的:
SET @SKU = CASE @SKU WHEN '' THEN NULL ELSE @SKU END
编辑
对于所有变量。。。
SELECT
@ID = CASE @ID WHEN '' THEN NULL ELSE @ID END,
@Name = CASE @Name WHEN '' THEN NULL ELSE @Name END,
@PhoneNumber = CASE @PhoneNumber WHEN '' THEN NULL ELSE @PhoneNumber END,
@Price = CASE @Price WHEN '' THEN NULL ELSE @Price END,
@NewPrice = CASE @NewPrice WHEN '' THEN NULL ELSE @NewPrice END,
@ModelNumber = CASE @ModelNumber WHEN '' THEN NULL ELSE @ModelNumber END,
@SKU = CASE @SKU WHEN '' THEN NULL ELSE @SKU END¸
EDIT2
如果有人使用我建议的那种代码,忘记它,像其他人建议的那样使用NULLIF()。我完全忘记了它的存在。
请在select
子句中尝试以下内容。
select ISNULL( nullif(EmptyOrNullOrBlankColumn,'' ),NULL)
Where
条款。
where ISNULL( nullif(EmptyOrNullOrBlankColumn,'' ),NULL) is not null
就我个人而言,我不喜欢其他一些答案中嵌套的NULLIF
和ISNULL
。我发现这个逻辑很难遵循,更喜欢使用简单的IIF( condition, true_value, else_value )
SQL使用三值逻辑true
、false
和unknown
。
对于IIF
,如果condition
的计算结果为true
,则进入第一种情况,否则(当为false
或unknown
时)则进入else
情况。
与NULL
(无论是=
还是<>
、LIKE
还是NOT LIKE
)的比较将评估为unknown
。
因此,您只需要仔细考虑您想要的语义,并以一种方式来表达它,即根据需要,空字符串可以加上或不加NULL
。
需要注意的另一件事是,SQL Server通常会忽略LEN或字符串比较的尾部空格。然而,它确实将它们视为LIKE在LHS上的重要价值。
因此,以下表达式提供了各种不同的语义来选择所需的语义。
SELECT
ValueUnderTest
,StringLength = DATALENGTH(ValueUnderTest)
,IsEmpty = IIF(ValueUnderTest = '', 'True', 'False')
,IsNullOrEmpty = IIF(ValueUnderTest <> '', 'False', 'True')
,IsZeroLength = IIF('' LIKE ValueUnderTest, 'True', 'False')
,IsNullOrZeroLength = IIF('' NOT LIKE ValueUnderTest, 'False', 'True')
FROM
(
VALUES (''),
(' '),
(NULL),
('Fish')
) TestData(ValueUnderTest)
返回
测试下的值 | 字符串长度 | IsEmpty | IsNullOrEmpty | IsZeroLength | IsNullOrZeroLength |
---|---|---|---|---|---|
0 | 正确 | 正确 | 正确 | 正确 | |
1 | 正确 | 正确 | 错误 | 错误 | |
NULL | NULL | 错误 | 正确 | 错误 | 正确 |
鱼 | 4 | 错误 | 错误 | 错误 | 错误 |
如果您将"视为空字符串,则可以使用
LEN(RTRIM(ISNULL(字段名,''))>0
当您想要的是布尔结果,例如Y/N或true/false,例如在报告中,那么建议的NULLIF等简单语句将没有帮助。这里有一个解决方案:
case when LEN(isnull(iv.value2, 'Y')) = 0 then 'Y' else 'N' end isEmpty
SELECT ISNULL( CASE StringColum1 WHEN '' THEN NULL ELSE textcolum1 END ,textcolum2)