SQL 服务器解析 XML 列以获取列值,如果其他列值等于特定值

SQL Server parse XML column to get a column value if other column value equals certain value

在 SQL Server 2014 中,table 的 CustomColumns 列包含具有以下结构的 XML 数据:

<CustomColumnsCollection>
  <CustomColumn>
    <Name>Brand</Name>
    <DataType>0</DataType>
    <Value>Duprim</Value>
  </CustomColumn>
  <CustomColumn>
    <Name>LabelGroup</Name>
    <DataType>0</DataType>
    <Value />
  </CustomColumn>
...
</CustomColumnsCollection>

我想获取列 Value 的值,其中列 Name 等于,即 'Brand' (以下代码是更大查询的一部分,我将其保存为 VIEW):

MAX(DISTINCT PR.CustomColumns.value('(/CustomColumnsCollection/CustomColumn/Name="Brand"/Value)[0]', 'varchar(max)')) AS Brand

在这种情况下,我希望它 return 'Duprim'。这是如何实现的?

尝试这样的事情:

SELECT
    xc.value('(Value)[1]', 'varchar(50)') 
FROM
    PR
CROSS APPLY
    PR.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn') AS XT(XC)
WHERE   
    xc.value('(Name)[1]', 'varchar(50)') = 'Brand'

.nodes() returns 一个 XML 片段的列表,每个片段代表一个 <CustomColumn> 节点。 Select WHERE 子句中 Name 值为 Brand 的节点,并为该 XML 节点获取 Value 的值

这是使用 XPath 谓词的另一种方法。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, CustomColumns XML);
INSERT INTO @tbl (CustomColumns)
VALUES
(N'<CustomColumnsCollection>
    <CustomColumn>
        <Name>Brand</Name>
        <DataType>0</DataType>
        <Value>Duprim</Value>
    </CustomColumn>
    <CustomColumn>
        <Name>LabelGroup</Name>
        <DataType>0</DataType>
        <Value/>
    </CustomColumn>
</CustomColumnsCollection>');
-- DDL and sample data population, end

DECLARE @param VARCHAR(30) = 'Brand';

SELECT  ID
    , c.value('(Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl
    CROSS APPLY CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq sql:variable("@param")]') AS t(c);

-- hard-coded value
SELECT  ID
    , c.value('(Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl
    CROSS APPLY CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq "Brand"]') AS t(c);

Output

+----+--------+
| ID | Value  |
+----+--------+
|  1 | Duprim |
+----+--------+

帮助您了解 MS 使用的视图 Excel。 如果您能提供一个最小的可重现示例,那就太好了: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT,T-SQL 语句。 (2) 你需要做什么,即逻辑。 (3) 基于上面 #1 中示例数据的期望输出。

SQL for Excel

SELECT ID
    , CustomColumns.value('(/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq "Brand"]/Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl;