我正在尝试将人员表转换为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>
答案 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