代码之家  ›  专栏  ›  技术社区  ›  Przemyslaw Remin

SQL拆分字符串并获取空值,而不是空字符串

  •  1
  • Przemyslaw Remin  · 技术社区  · 5 年前

    如何拆分字符串并获取空值而不是空字符串。

    我对两种方法特别感兴趣 STRING_SPLIT XML . 我希望这个问题:

    SELECT * FROM STRING_SPLIT('a,b,,d', ',');
    

    将在第三排返回 NULL 而不是空字符串。 是否有任何简单的方法来实现它,即使用特殊字符?我的意思是:

    SELECT * FROM STRING_SPLIT('a,b,[null],d', ',') -- this, of course, wouldn't go
    

    我希望我可以使用 XML 方法:

    CREATE FUNCTION dbo.SplitStrings_XML
    (
       @List       varchar(8000),
       @Delimiter  char(1)
    )
    RETURNS TABLE WITH SCHEMABINDING
    AS
       RETURN (SELECT [value] = y.i.value('(./text())[1]', 'varchar(8000)')
          FROM (SELECT x = CONVERT(XML, '<i>' 
              + REPLACE(@List, @Delimiter, '</i><i>') 
              + '</i>').query('.')
          ) AS a CROSS APPLY x.nodes('i') AS y(i));
    

    从这里抓取的代码: https://sqlperformance.com/2016/03/t-sql-queries/string-split

    2 回复  |  直到 5 年前
        1
  •  15
  •   Thom A    5 年前

    将返回的值包装为 NULLIF :

    SELECT NULLIF([value],'') FROM STRING_SPLIT...
    
        2
  •  3
  •   Tim Biegeleisen    5 年前

    从我所看到的,逗号之间的值实际上显示为空字符串。所以,你可以使用 CASE 要用替换空字符串的表达式 NULL :

    WITH cte AS (
        SELECT * FROM STRING_SPLIT('a,b,,d', ',')
    )
    
    SELECT
        value,
        CASE WHEN value = '' THEN NULL ELSE value END AS value_out
    FROM cte;