[英]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.