选择字段的字符串sql

时间:2018-10-05 03:23:45

标签: sql sql-server xml

我有一个像这样的列数据结构,它可以超过一行,然后是一个以上的值,我想从该字段中获取deliveryID的值,有什么办法吗? 我看了一下节点和xmlpath,value() 有什么优雅的方法吗?非常感谢

    <row>
      <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
      <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
      <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
      <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address">jello@anc.com</value>
      <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
    </row>

1 个答案:

答案 0 :(得分:0)

如果您拥有SQL Server 2016或更高版本,则可以使用OPENXMLJSON_VALUE

DECLARE @XML XML ='<row>
      <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
      <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
      <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
      <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address">jello@anc.com</value>
      <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
    </row>'

DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @XML;

SELECT id, [display-name],
    CASE WHEN ISJSON(JsonText) > 0  THEN JSON_VALUE(JsonText, '$.transactions[0].deliveryId') END deliveryId
    , JsonText
     FROM 
    OPENXML(@idoc,'row/value') 
        WITH (id uniqueidentifier, 
            [display-name] varchar(20),
            JsonText varchar(max) '.' )

结果:

id                                   display-name         deliveryId         JsonText
------------------------------------ -------------------- ------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1AE95D67-599E-4AB6-9FFD-08D4D90AB608 Cardholder_id        NULL               17
1AE95D67-599E-4AB6-9FFD-08D4D90AB608 Cardholder_id        NULL               17
EB71FD46-F0B2-401D-9775-08D4D90AB608 Card_Number          NULL               3083 2614 5022 21321
4FC261B2-F776-4FD4-8E1D-08D4D90AB608 Email_Address        NULL               jello@anc.com
C867D4E5-CC0B-4EE6-B911-08D6134132E0 BP_TRIGGERS_2.0      20320925           {"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}       

您也可以使用此语法。

 SELECT 
    RowValue.value('@id', 'uniqueidentifier')  id,
    CASE WHEN ISJSON(RowValue.value('.', 'VARCHAR(max)') ) > 0  
        THEN JSON_VALUE(RowValue.value('.', 'VARCHAR(max)'), '$.transactions[0].deliveryId') 
        END AS deliveryId
    FROM 
    (VALUES(@XML)) AS T (XmlValue)
    CROSS APPLY 
        T.XmlValue.nodes('row/value') AS XT(RowValue)