【问题标题】:Fetching Data from XML along with the Conditions in a single Query从 XML 中获取数据以及单个查询中的条件
【发布时间】:2017-06-10 17:05:56
【问题描述】:
declare @X XML=
'<Detail>
 <Gender>M</Gender>
 </Detail>'

我想查询上面的简单 XML,我想计算性别标签中存在的值

如果它的值为“M”,那么我想取回结果为 1
否则,如果它的值为“F”,那么我想取回结果为 2
否则返回 0

我们可以通过使用以下查询将性别值返回为 M 轻松完成此操作

SELECT 
@X.value('(Detail/Gender)[1]', 'varchar') as Gender

然后存储在一个局部变量中,然后使用条件语句计算相应的返回值。

从 XML 本身获取时有什么办法吗?

我的意思是在从@x 本身中选择性别时,我们必须使用条件语句来返回最终值(即 1 或 2 或 3)

这也有助于消除局部变量/查询成本,这可以在单个 Fetch 中完成

以下将是我必须从单个查询中获取的所需结果

Gender
1

【问题讨论】:

    标签: sql xml tsql xpath xquery


    【解决方案1】:

    试试类似的东西

    SELECT 
    CASE WHEN @X.value('(Detail/Gender)[1]', 'varchar(max)')='M' THEN 1 ELSE 2 END  as Gender
    

    或者使用目录表并将 (M, F, ? ...) 连接到任何映射值。

    更新:目录表

    DECLARE @xml XML=
    N'<Detail>
     <Gender>M</Gender>
     <Gender>F</Gender>
     <Gender>oops</Gender>
     </Detail>';
    
    DECLARE @mockup TABLE(Code VARCHAR(1),Value VARCHAR(10));
    INSERT INTO @mockup VALUES('M',1),('F',2);
    
    SELECT m.Value
    FROM @xml.nodes(N'/Detail/Gender') AS A(g)
    LEFT JOIN @mockup AS m ON m.Code=g.value(N'text()[1]','nvarchar(max)');
    

    【讨论】:

    • 是的,这对我来说适用于 Case 语句。但我无法获得您在此处引用的 Catalog 表的任何参考。如果您不介意,请参考一些链接如何实现此类目录表。
    • 那太好了,感谢 +1 对我的澄清
    猜你喜欢
    • 2021-09-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多