我有以下代碼可用于在 2 個字串之間查找文本。我需要幫助來查找多次出現的文本。在這種情況下,我試圖在開始和結束之間查找文本。在這種情況下,它會正確回傳一、二、三。
DECLARE @text AS VARCHAR(MAX) = 'this is for first <start> one, two, three <end>.';
DECLARE @pretext AS nvarchar(100) = '<start>'
DECLARE @posttext AS nvarchar(100) = '<end>'
SELECT
CASE
WHEN CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text) len(@pretext)) < 0
THEN ''
ELSE SUBSTRING(@Text,
CHARINDEX(@pretext, @Text) LEN(@pretext),
CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text)
LEN(@pretext)))
END AS textinbetween
接下來,如果我有如下字串:
DECLARE @text AS VARCHAR(MAX) = 'this <end><end>is for first <start> one, two, three <end>.this is for second <start> four, five, six<end>.';
本質上,我需要介于和之間的所有文本。在這種情況下,有 2:一、二、三和四、五、六。我可以有任何 x 數量,所以只需要在所有這些之間獲取該文本。
先感謝您
uj5u.com熱心網友回復:
由于“錯誤”的開始和結束,這是在 T-SQL 中做的丑陋的事情。也許是 CTE。我更新了測驗字串以包含錯誤的開始。如果要在結果中排??除錯誤的開始和結束標記,可以在最終子字串之后替換它們。
DECLARE @text AS VARCHAR(MAX) = 'this <end><end>is for first <start> one, two, three <end>.this is for second <start> four, five, <start>six<start><end>.';
DECLARE @pretext as VARCHAR(128) = '<start>'
DECLARE @posttext as VARCHAR(128) = '<end>';
WITH Tokens as (
SELECT CHARINDEX(@pretext, @Text, 1) as [startIndex],
CHARINDEX(@posttext, @Text, CHARINDEX(@pretext, @Text, 1)) as [stopIndex],
1 as [TokenNumber]
WHERE CHARINDEX(@pretext, @Text, 1) > 0
and CHARINDEX(@posttext, @Text, CHARINDEX(@pretext, @Text, 1)) > 0
UNION ALL
SELECT CHARINDEX(@pretext, @Text, t.[stopIndex]) as [startIndex],
CHARINDEX(@posttext, @Text, CHARINDEX(@pretext, @Text, CHARINDEX(@pretext, @Text, t.[stopIndex]))) as [stopIndex],
t.TokenNumber 1
FROM Tokens t
WHERE CHARINDEX(@pretext, @Text, t.[stopIndex]) > 0
AND CHARINDEX(@posttext, @Text, CHARINDEX(@pretext, @Text, CHARINDEX(@pretext, @Text, t.[stopIndex]))) > 0
) SELECT *,
SUBSTRING(@Text, [startIndex] LEN(@pretext), [stopIndex] - [startIndex] - LEN(@pretext))
FROM Tokens
uj5u.com熱心網友回復:
假設可以在自己的行中包含每個值 string_split 是一個簡單的選項。如果您需要將其放在單行中,則有數千個示例說明如何旋轉或使用東西將它們放回單行。
declare @asdf varchar(100) = 'This is a test <one>first string<two> and this is the second <one>second string<two>.'
select left(x.value, charindex('<two>', x.value) - 1)
from string_split(replace(@asdf, '<one>', '^'), '^') x --The delimiter is limited to a single character so just used replace to switch it for a character not in your string.
where charindex('<two>', x.value) > 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467821.html
