将空字符串替换为XML变量中的NULL

时间:2019-01-29 15:58:30

标签: sql sql-server xml tsql

希望此查询返回NULL而不是空字符串。

declare @str varchar(max)='A,,C;D,E,F;X,Y,Z'; -- please notice missing B
declare @xmlstr XML
set @xmlstr = CAST(('<rows><row><col>' + REPLACE(REPLACE(@str,';','</col></row><row><col>'),',','</col><col>') + '</col></row></rows>') AS XML)

SELECT
     t.n.value('col[1]','nvarchar(max)') as Col1
    ,t.n.value('col[2]','nvarchar(max)') as Col2
    ,t.n.value('col[3]','nvarchar(max)') as Col3
FROM
    @xmlstr.nodes ('/rows/row') AS t(n)

此示例来自https://stackoverflow.com/a/39752683/1903793

从答案:SQL split string and get NULL values instead of empty string开始,我知道可以使用NULLIF函数轻松包装来解决它:

SELECT
     nullif(t.n.value('col[1]','nvarchar(max)'),'') as Col1
    ,nullif(t.n.value('col[2]','nvarchar(max)'),'') as Col2
    ,nullif(t.n.value('col[3]','nvarchar(max)'),'') as Col3

但是,我想知道是否可以通过直接使用 XML变量而不是随后使用XML来固定它。

注意。我的问题追随SQL split string and get NULL values instead of empty string,请不要将其标记为重复,因为我尚未收到XML方法的答案。

1 个答案:

答案 0 :(得分:0)

此答案完全归功于Jeroen Mostert。有关详细信息,请参阅他的评论。

declare @str varchar(max)='A,,C;D,E,F;X,Y,Z'; -- please notice missing B
declare @xmlstr XML
set @xmlstr = CAST(('<rows><row><col>' + REPLACE(REPLACE(@str,';','</col></row><row><col>'),',','</col><col>') + '</col></row></rows>') AS XML)

SELECT
     t.n.value('col[1]/text()[1]','nvarchar(max)') as Col1
    ,t.n.value('col[2]/text()[1]','nvarchar(max)') as Col2
    ,t.n.value('col[3]/text()[1]','nvarchar(max)') as Col3
FROM
    @xmlstr.nodes ('/rows/row') AS t(n)