2017-06-15 82 views
0

我有一個表是nvarchar(max)的列。我想搜索這個專欄,看看是否有具體的陳述。我可以做到這一點:選擇nvarchar的子字符串max

SELECT sectionText 
FROM Section 
WHERE sectionText LIKE '%This statement is true%' 

但是,這將返回整個部分的文本。我希望它只在單個列中返回此語句之前的50個字符和50個字符。

+3

這是一個奇怪的要求,但很容易。你會使用substring和charindex。 –

回答

1

您可以嘗試以下:

--This line would replace your phrase 
SELECT REPLACE(sectionText,'This statement is true','') 
FROM Section ; 

--Another way... 
--Assuming your column is: 50 characters + ' ' + 'This statement is true' + ' ' + The other 50 characters 
SELECT SUBSTRING(sectionText, 1, 50) + ' ' + SUBSTRING(sectionText, 74, 50) 
FROM Section 
WHERE sectionText LIKE '%This statement is true%'; 

您可以檢查這個MSDN鏈接瞭解更多info。 讓我提供簡單的例子:

SELECT x = SUBSTRING('abcdef', 2, 3) 

SELECT x= SUBSTRING('abcdef', 2,1) + SUBSTRING('abcdef', 5,1) 

感謝@SeanLange評論(更好的方法):

DECLARE @sectionText VARCHAR(1200) = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut a dui quam. Sed pretium purus sed lorem volutpat fringilla. Sed imperdiet sodales justo, sed suscipit mi maximus ac. Aenean ligula quam, gravida a eleifend a, vulputate nec dolor. Donec sit amet mi in justo mollis mollis eu ac magna. Integer dolor nulla, mollis eu tempus et, lobortis in libero. Etiam vitae pulvinar mauris. Curabitur a nulla orci. This statement is true. Nam non est nec urna aliquam gravida. Sed diam lorem, finibus eu arcu et, iaculis ullamcorper diam. Sed vitae tellus odio. In hac habitasse platea dictumst. Maecenas lobortis consequat erat. Fusce aliquam imperdiet.'; 
DECLARE @MyPattern varchar(10) = 'This statement is true'; 

DECLARE @firstPosition INT, @lastPosition INT, @gambit INT, @textLenght INT; 

--Grabbing the positions 
SET @firstPosition = CHARINDEX(@sectionText, @sectionText,49) 
SET @gambit = LEN(@MyPattern) 
SET @lastPosition = @firstPosition + (@gambit + 1); --Sum 1 because of a White Space of a 
SET @textLenght = LEN(@sectionText); 

SELECT SUBSTRING(@sectionText, 1, @firstPosition) + ' ' + SUBSTRING(@sectionText, @lastPosition, @textLenght) AS [CleanText] 
--FROM Section 
--WHERE sectionText LIKE '%This statement is true%'; 
+1

如果找到的字符串從位置100開始,這不起作用。它肯定是正確的方向,但不足以捕獲OP要查找的內容。 –

+0

我花時間閱讀,你是對的@SeanLange,我想開發一個片段,但是CHARINDEX()在大VARCHAR上不適合我,你知道爲什麼嗎? –

+1

由於您嘗試搜索的字符串不在您的變量中,因此您被弄糊塗了。你的變量被聲明爲varchar(175),但你的字符串直到第410個位置纔開始。這意味着你的變量有一個無聲的截斷。機會部分文本會更長。 –

0

這是我能夠做到:

SELECT SUBSTRING(sectionText, CHARINDEX('This statement is true', sectionText)-50, 100) 
FROM Section 
WHERE sectionText LIKE '%This statement is true%' 
+0

這也不符合你的要求。但它非常接近。你說你想要的值是你正在搜索的50個字符。您需要將len(SearchVal)添加到子字符串的長度,而不僅僅是100。 –