简体   繁体   English

如何从 SQL 服务器中的文本中提取字符串

[英]How to extract string from a text in SQL Server

I have texts like "DBName_TemplateDB_TESTDB01234_document" and "DBName_TemplateDB_TESTDB01234678_document".我有像“DBName_TemplateDB_TESTDB01234_document”和“DBName_TemplateDB_TESTDB01234678_document”这样的文本。 From both texts need to extract string between second underscore( ) and last underscore( ) like "TESTDB01234" and "TESTDB01234678".从两个文本中都需要提取第二个下划线( )和最后一个下划线( )之间的字符串,如“TESTDB01234”和“TESTDB01234678”。

Can you please help how to string in SQL Server using SUBSTRING and CHARINDEX?你能帮忙如何使用 SUBSTRING 和 CHARINDEX 串入 SQL 服务器吗?

Example:例子:

Input Text: 'DBName_TemplateDB_TESTDB01234_document' Output: TESTDB01234输入文本:'DBName_TemplateDB_TESTDB01234_document' Output: TESTDB01234

Input Text: 'DBName_TemplateDB_TESTDB01234678_document' Output: TESTDB01234678输入文本:'DBName_TemplateDB_TESTDB01234678_document' Output: TESTDB01234678

I tried to extract and it's working only from the first underscore like below.我试图提取它,它只从下面的第一个下划线开始工作。

  declare @Dbname varchar(max) = '#new#-TESTDB01234_document'
  select substring( LEFT(@DbName,charindex('_',@DbName)-1),charindex('TEST',@DbName),len(LEFT(@DbName,charindex('_',@DbName)))-1)

Using charindex使用字符索引

declare @Dbname varchar(max) = 'DBName_TemplateDB_TESTDB01234678_document'

select right(left(@DbName,third - 1), third - second - 1)
from (
  select charindex('_',@DbName,charindex('_',@DbName) + 1) second,
         charindex('_',@DbName,charindex('_',@DbName,charindex('_',@DbName) + 1) + 1) third
) t

Will this work for you?这对你有用吗?

--OPTION ONE: SUBSTRING
DECLARE @Start INT = CHARINDEX('TEST', @Dbname);
DECLARE @End INT = LEN(@Dbname) - (CHARINDEX('_', REVERSE(@Dbname)) - 1) - @Start;
SELECT SUBSTRING(@Dbname, @Start, @End) AS [Name]

--OPTION TWO: DOUBLE REPLACE
SELECT REPLACE(REPLACE(@Dbname, 'DBName_TemplateDB_', ''), '_document', ''); AS [Name]

--OPTION THREE: STRING_SPLIT
SELECT TOP 1 value AS [Name]
    FROM STRING_SPLIT(@Dbname, '_') 
    WHERE value LIKE 'Test%'

I added a few options, sorry if its outside the scope of the question.我添加了一些选项,抱歉,如果它在问题的 scope 之外。

If you are looking for data between the second and the last underscore, I will give the following approach as there might be more underscores between these ones:如果您正在寻找第二个和最后一个下划线之间的数据,我将提供以下方法,因为这些下划线之间可能有更多下划线:

declare @Dbname varchar(max) = 'DBName_TemplateDB_TESTDB01234678_1_2_3_document'

DECLARE @DbnameXML XML = '<a>' + REPLACE(@Dbname, '_', '</a><a>') + '</a>';

SELECT STRING_AGG([value], '_') WITHIN GROUP (ORDER BY [value_id])
FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY T.c) - 1
          ,T.c.value('.', 'VARCHAR(128)')
          ,COUNT(1) OVER()
    FROM @DbnameXML.nodes('a') T(c)
) DS ([value_id], [value], [values_count])
WHERE [value_id] > 1
    AND [value_id] + 1 < [values_count]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM