【问题标题】:Using LEFT() and SUBSTRING() to pull only so many characters from string使用 LEFT() 和 SUBSTRING() 从字符串中只提取这么多字符
【发布时间】:2020-04-22 11:22:18
【问题描述】:

我正在尝试从我的数据库中非常长的 XML 字段中切出文本的确切部分 - 我只想要以单词“General_Notes”开始并以“General_Notes_Conv”结尾的文本 - 我使用了这个建议发布here 将此行加入我的查询:

LEFT(SUBSTRING(PCO.Cycle_Order_Xml,
                   CHARINDEX('General_Notes', PCO.Cycle_Order_Xml), 500),
                   CHARINDEX('General_Notes_Conv', PCO.Cycle_Order_Xml))

这很有效,除了现在它从“General Notes”开始提取价值 500 个字符的文本 - 我的印象是第二个 CHARINDEX 表示我只提取文本直到出现该单词 - 我是不知道第二个CHARINDEX 有什么目的,但我希望这是动态的,只从General Notes 拉到General_Notes_Conv - 我应该改变什么?

【问题讨论】:

  • Substring 中的第三个参数为您提供长度,它指定将返回表达式的多少个字符。

标签: sql-server substring


【解决方案1】:

子字符串的作用类似于SUBSTRING(input_string, start, length)

LEFT ( input_string , number_of_characters ) 一样离开工作。

我认为你只需要SUBSTRING

您可以通过从“General_Notes_Conv”的位置减去“General_Notes”的位置并调整开始标签(即“General_Notes”)的长度来找到length,因为索引给出了字符串的开头。

SUBSTRING(column_name, CHARINDEX('General_Notes', column_name) + LEN('General_Notes'), CHARINDEX('General_Notes_Conv', column_name) - CHARINDEX('General_Notes', column_name))

【讨论】:

    【解决方案2】:

    CHARINDEX() 为您获取指定的字符位置。你需要找到不同之处

    DECLARE @String VARCHAR(200) = 'Some text you don''t care about General_Notes this is the data i want General_Notes_Conv more stuff I don''t care about'
    
    SELECT LTRIM(RTRIM(SUBSTRING(@String, CHARINDEX('General_Notes', @String), 
                                          CHARINDEX('General_Notes_Conv', @String) 
                                             - CHARINDEX('General_Notes', @String))))
    

    要只获取两者之间的数据,只需添加一点点即可。

    DECLARE @String VARCHAR(200) = 'Some text you don''t care about General_Notes this is the data i want General_Notes_Conv more stuff I don''t care about'
    
    SELECT LTRIM(RTRIM(SUBSTRING(@String, CHARINDEX('General_Notes', @String) + 13, 
                                          CHARINDEX('General_Notes_Conv', @String) 
                                          - CHARINDEX('General_Notes', @String))))
    

    要同时包含两个标签:

    DECLARE @String VARCHAR(200) = 'Some text you don''t care about <General_Notes> this is the data i want <General_Notes_Conv> more stuff I don''t care about'
    
    SELECT LTRIM(RTRIM(SUBSTRING(@String, CHARINDEX('<General_Notes>', @String), 
                                          CHARINDEX('<General_Notes_Conv>', @String) 
                                             - CHARINDEX('<General_Notes>', @String) + 19)))
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 2014-01-27
      • 2014-12-29
      相关资源
      最近更新 更多