在SQL Server XML结果的Case语句中从int返回''

时间:2018-08-28 19:33:14

标签: sql sql-server xml

我正在尝试将人员表转换为XML。我的姓名字段是varchar,而我的年龄字段是int。每次为NULL时,XML转换会将其转换为0。我希望它为''(如果为NULL,则XML会跳过该字段)。

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END,
               CASE WHEN AGE IS NULL THEN ' ' ELSE AGE END
               FROM TABLE.PERSONS FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE

年龄为NULL时的结果是:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE>0</AGE>
    </PERSON>
</PERSONS>

我想要的是:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE> </AGE>
    </PERSON>
</PERSONS>

3 个答案:

答案 0 :(得分:5)

' 'varchar,而不是int。因此,在CASE表达式中,您的值' '被隐式转换为int(因为int的{​​{3}}比varchar高)。如果尝试使用SELECT CONVERT(int, ' ');,则会发现返回值为0

您需要将年龄转换为varchar

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END AS NAME,
               CASE WHEN AGE IS NULL THEN ' ' ELSE CONVERT(varchar(3),AGE) END AS AGE --I assume you no will have the age 1000 (or more)
               FROM TABLE.PERSONS FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE;

我还注意到,您的CASE表达式缺少它们的END

答案 1 :(得分:4)

如果是2012年以后的版本,另一种选择是使用NULLIF()和Concat()

示例

Declare @YourTable table (Name varchar(50),Age int)
Insert Into @YourTable values
 ('Jim',0)
,('Jane',null)
,('John',25)

Select Name = IsNull(Name,'')
      ,Age  = concat('',NullIf(Age,0))
 From  @YourTable 
 For XML Path('PERSON'),Root('PERSONS')

返回

<PERSONS>
  <PERSON>
    <Name>Jim</Name>
    <Age></Age>
  </PERSON>
  <PERSON>
    <Name>Jane</Name>
    <Age></Age>
  </PERSON>
  <PERSON>
    <Name>John</Name>
    <Age>25</Age>
  </PERSON>
</PERSONS>

答案 2 :(得分:1)

Case语句查看源列数据类型(int)并将空字符串转换为0 int,这是优先级较高的数据类型,简单的解决方案是使用子查询转换int数据输入字符串,然后使用case语句。像...

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END Name,
               CASE WHEN AGE IS NULL THEN  ' ' ELSE AGE END  Age
        FROM
        (SELECT NAME , CAST(AGE AS VARCHAR(10)) AS AGE FROM Table.Persons) x
        FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE