在SQL Server 2012中使用COALESCE()函数

3
我有以下查询,其中我在SQL中使用了COALESCE()函数。如果在LOOKUP_TABLE的NOTES列中没有找到任何内容,我希望我的查询返回文本“未维护注释”。当它没有找到任何值时,查询返回空白而不是期望的值。
SELECT 
    COALESCE(CONVERT(NVARCHAR(max), NOTES),'No Notes Maintained') AS NOTES 
FROM
    LOOKUP_TABLE LT
INNER JOIN 
    LOOKUP_VALUE LV ON LT.ID = LV.ID
NOTES列的数据类型是varchar,它可以包含NULL、空白值或任何文本字符串,例如- 这是一个注释。
非常感谢您提供的任何帮助。
谢谢。

你能像这样做吗:SELECT CASE WHEN Notes IS NULL OR LEN(Notes)=0 THEN '未维护注释' ELSE Notes END AS TheNotes - JonH
1
你的表中的NOTES值是什么?COALESCE()函数返回第一个非空值。空白或空字符串不是null,所以我们只能猜测该值为空而不是null。 - Steve P
2
请记住,NULL和空字符串是两个不同的东西。 - Andrew Morton
@SteveP 你好,感谢您的回复。我刚刚更新了问题。 - Newbie
5个回答

3

为什么要使用CONVERT(NVARCHAR(max)

使用这个将会返回你所需的内容:

CASE WHEN NOTES <> '' THEN NOTES ELSE 'No Notes Maintained' END) AS NOTES

NOTES <> '' 涵盖了NULL、空字符串和空格。


非常感谢。这看起来简单得多,而且很有效。 - Newbie
1
@新手:当你认为这个答案解决了你的问题时,你应该接受它。 - dnoeth

2

正如评论所建议的那样,如果您在 NOTES 列中有空格,则 COALESCE 不会替换该值,因为它不是 null。如果您希望将 NULL 和空格视为相同的东西,即逻辑上的缺失值,则尝试以下查询:

SELECT
    CONVERT(NVARCHAR(max),
        CASE WHEN COALESCE(REPLACE(NOTES, ' ', ''), '') = ''
             THEN 'No Notes Maintained'
             ELSE NOTES END) AS NOTESNOTES 
FROM LOOKUP_TABLE LT
INNER JOIN LOOKUP_VALUE LV
    ON LT.ID = LV.ID;

谢谢@Tim Biegeleisen。如果脚本发现NULL,它是否也会返回“未维护注释”?我确实希望将NULL和空格视为相同。 - Newbie
@Newbie 是的,它会的,请查看演示 - Tim Biegeleisen

1

尝试这个应该有帮助:

SELECT CASE WHEN ISNULL(CONVERT(NVARCHAR(max), NOTES),'')!='' THEN CONVERT(NVARCHAR(max), NOTES) ELSE'No Notes Maintained' END AS NOTES 
FROM   LOOKUP_TABLE LT
  INNER JOIN LOOKUP_VALUE LV ON LT.ID = LV.ID

0
鉴于注释字段可以为NULL,空白或空字符串,以下代码应返回您所需的结果:
SELECT     
    CONVERT( NVARCHAR(MAX), 
    CASE 
        WHEN ISNULL(LTRIM(RTRIM(NOTES), '')) = '' THEN 'No Notes Maintained'
        ELSE NOTES
    END) AS NOTES 
FROM
    LOOKUP_TABLE LT
INNER JOIN 
    LOOKUP_VALUE LV ON LT.ID = LV.ID

0

请试试这个。

SELECT ISNULL(NULLIF(LTRIM(RTRIM(column_name)), ''), 'Display Text')
FROM TableName

解释:您可以使用LTRIM和RTRIM一起从字符串的两侧删除空格。当一个字符串只有空格时,它将返回一个空字符串值(而不是null值)。
然后使用NULLIF()函数,您可以比较两个表达式。如果expr1和expr2相等,则NULLIF()函数返回NULL。否则,它返回expr1。在这种情况下,当字符串是一个空值时,它将返回NULL,因为它被与一个空字符串进行比较。
最后,您可以使用ISNULL()函数在表达式为NULL时返回替代值。
SELECT 
    ISNULL(NULLIF(LTRIM(RTRIM(LT.NOTES)), ''), 'No Notes Maintained') 
FROM
    LOOKUP_TABLE LT
INNER JOIN 
    LOOKUP_VALUE LV ON LT.ID = LV.ID

或者你可以像这样做...

SELECT 
CASE
    WHEN Len(column_name) > 0 THEN column_name -- Covers NULL, Empty Strings and Whitespaces.
    ELSE 'Display Text'
END
FROM TableName;

对于您的情况,查询将会是这样的。

SELECT 
CASE
    WHEN Len(LT.NOTES) > 0 THEN LT.NOTES
    ELSE 'No Notes Maintained'
END
FROM 
    LOOKUP_TABLE LT
INNER JOIN 
    LOOKUP_VALUE LV ON LT.ID = LV.ID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接