我有以下SQL查询(SQL Server 2005):
Select TOP 1000 col1,
LTRIM(RTRIM(cast(col2 as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col3 as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col4 as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col5 as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col6 as varchar))))
from mytable
但是我遇到了一些问题,因为这些列都可以为空,并且在这个连接中我不能有NULL值。在这种情况下避免NULL值的最好方法是什么?
提前致谢!
答案 0 :(得分:3)
包装ISNULL()
Select TOP 1000 col1,
LTRIM(RTRIM(cast(ISNULL(col2,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col3,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col4,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col5,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col6,'') as varchar))))
from mytable
或COALESCE()
Select TOP 1000 col1,
LTRIM(RTRIM(cast(COALESCE(col2,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col3,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col4,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col5,'') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col6,'') as varchar))))
from mytable
如果使用SQL Server 2012,那么感谢CONCAT()
更加容易(您也可以将SPACE(2)
替换为上面的' | '
):
Select TOP 1000 col1
,CONCAT(LTRIM(RTRIM(cast(col2 as varchar)))
,' | ', LTRIM(RTRIM(col3))
,' | ', LTRIM(RTRIM(col4))
,' | ', LTRIM(RTRIM(col5))
,' | ', LTRIM(RTRIM(col6)))
from mytable
答案 1 :(得分:1)
当有NUll时,你可以通过ISNULL函数获得一些其他值。以下是一个示例查询:
Select TOP 1000 col1,
LTRIM(RTRIM(cast(ISNULL(col2,'SOMEVALUE') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col3,'SOMEVALUE') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col4,'SOMEVALUE') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col5,'SOMEVALUE') as varchar)))
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col6,'SOMEVALUE') as varchar))))
from mytable
答案 2 :(得分:1)
如果这是一个非关键系统,并且你不能为每列COALESCE或ISNULL打扰,你可以使用CONCAT_NULL_YIELDS_NULL服务器变量来将连接的空值视为空字符串:
SELECT 'Hi ' + NULL
会产生无效。
SET CONCAT_NULL_YIELDS_NULL OFF
SELECT 'Hi' + NULL
SET CONCAT_NULL_YIELDS_NULL ON
制作:“嗨”。
文档是here - 请注意,他们将来会删除此功能。
否则,只需关闭设置,然后运行原始查询。
答案 3 :(得分:0)
如果要正确连接值并且不想使用某个占位符作为空值,请使用isnull(或coalesce)+ stuff:
select top 1000
col1,
stuff(
isnull(' | ' + cast(col2 as varchar), '') +
isnull(' | ' + cast(col3 as varchar), '') +
isnull(' | ' + cast(col4 as varchar), '') +
isnull(' | ' + cast(col5 as varchar), '')
, 1, 3, '')
from mytable
<强> sql fiddle demo 强>