【问题标题】:Shortening Replace statement with RexEX?用 RegEX 缩短替换语句?
【发布时间】:2021-08-02 00:13:44
【问题描述】:

下面是我用来获取一些信息的 SQL 查询。此信息中有一个 XML 列。我想阅读这个 XML 并在 括号内解析出所需的 ID。下面的这个查询可以做到这一点,但我正在寻找一种更简洁的方法[如果它存在]:

SELECT 
    tblAT.*, 
    tblA.*,
    tblEM.[Custom] AS fullXML, 
    REPLACE(
        REPLACE(
            CONVERT(
                VARCHAR(MAX), 
                tblEM.[Custom].query('/Ind/ABC')
            )
        , '<ABC>'
        , ''
        )
    ,'</ABC>'
    ,''
    ) AS ABC
FROM 
    ATable AS tblA 
JOIN 
    LLink AS tblL 
        ON tblL.A_AID = tblA.AID 
JOIN 
    AssetsT AS tblAT 
        ON tblAT.AID = tblL.BAID 
JOIN 
    ExternalMetadata AS tblEM 
        ON tblEM.AID = tblA.AID 
WHERE 
    tblAT.ATID = 12 
AND 
    tblA.AID = 30610 
AND 
    tblA.CreatedDate > '2021-05-11 08:58:00'

XML strutor 如下所示:

<Ind>
  <ABC>some value here</ABC>
</Ind>

部分:

REPLACE(
    REPLACE(
        CONVERT(
            VARCHAR(MAX), 
            tblEM.[Custom].query('/Individual/ABC')
        )
    , '<ABC>'
    , ''
    )
,'</ABC>'
,''
) AS ABC

是我想要替换的可能更简单的类型,即从 XML 的开头和结尾删除 。

我希望能够使用 /]*>/g 进行一种正则表达式替换,以减少查询长度。

我使用的是 SQL 版本 13.0.5103.6。

那么有什么办法可以清理替换查询区吗?

【问题讨论】:

    标签: sql sql-server regex xml xml-parsing


    【解决方案1】:

    无需任何 RegEx 和/或多个 REPLACE() 调用。

    XQuery 可以轻松处理 XML 日期类型。

    看看

    SQL

    -- DDL and sample data population, start
    DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [Custom] XML);
    INSERT INTO @tbl ([Custom]) VALUES
    (N'<Ind>
      <ABC>some value here</ABC>
    </Ind>');
    -- DDL and sample data population, end
    
    SELECT * 
        , [Custom].value('(/Ind/ABC/text())[1]', 'varchar(30)') AS result
    FROM @tbl;
    

    输出

    +----+---------------------------------------+-----------------+
    | ID |                Custom                 |     result      |
    +----+---------------------------------------+-----------------+
    |  1 | <Ind><ABC>some value here</ABC></Ind> | some value here |
    +----+---------------------------------------+-----------------+
    

    【讨论】:

    • 谢谢!这比原来的更有效[和短]。将所有替换查询替换为 [Custom].value('(/Ind/ABC/text())[1]', 'varchar(MAX)') AS ABC 仍然给了我相同的输出但查询行更少:)
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多