【问题标题】:Extract string between period delimiter提取句点分隔符之间的字符串
【发布时间】:2015-08-08 02:29:50
【问题描述】:

我需要从下面的 SQL 字符串中提取 P4534。这两个时期之间的长度可以改变。因此,在执行子字符串时,我还需要考虑这两个句点之间更长的字符串。如何从不同的位置开始?

<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4534.2.3</mydata>

【问题讨论】:

  • 谢谢,但值并不总是 P4534。它可以是不同的,不同的长度。

标签: sql sql-server-2005


【解决方案1】:

AT() 函数返回一个整数,表示字符表达式的第一个字符的位置。

STORE '9.9.P4534.2.3' TO gcString
STORE 'P4534' TO gcFindString
SUBSTRING(gcString, AT(gcFindString,gcString), 5)

【讨论】:

    【解决方案2】:

    试一试。它是 XML 格式的,因此您可以利用 xQuery 获取 &lt;mydata&gt; 的值,然后替换每个 '.'使用 &lt;M&gt; 标签,然后再次使用 xQuery 将该结果集推送到表中,并将第 3 行作为您的值。

    DECLARE @STRING VARCHAR(1000)
    SET @STRING = '<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4534.2.3</mydata>'
    --SET @STRING = '<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4456789534.2.3</mydata>'
    
    DECLARE @XML TABLE (val VARCHAR(1000))
    INSERT INTO @XML(val) SELECT @STRING
    
    DECLARE @PARTS TABLE (id int identity(1,1), val VARCHAR(1000))
    
    INSERT INTO @PARTS (val)
    SELECT Split.a.value('.', 'VARCHAR(max)') AS String
    FROM  
    (
        SELECT CAST ('<M>' + REPLACE(CAST(Split.B.value('.', 'VARCHAR(max)') AS VARCHAR), '.', '</M><M>') + '</M>' AS XML) AS String
        FROM  (SELECT CAST(val AS XML) AS String  
               FROM @XML) AS B 
        CROSS APPLY String.nodes ('/mydata') AS Split(B)
    ) AS A 
    CROSS APPLY String.nodes ('/M') AS Split(a)
    
    SELECT val
    FROM @PARTS
    WHERE id=3
    

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 2012-08-18
      • 2015-08-01
      • 2016-02-10
      • 2016-09-05
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多