回答
只需用while
循環。
declare @str varchar(max), @newStr varchar(max), @orgStr varchar(max)
set @orgStr = 'A[1]/B2[2]/C_D[1]'
set @newStr = ''
set @Str = @orgStr
while (1=1)
begin
if (CHARINDEX('[',@str) <> 0)
begin
set @newStr = @newStr + SUBSTRING(@str,CHARINDEX('[',@str), CHARINDEX(']',@str) - CHARINDEX('[',@str)+1)
set @str = STUFF(@str, CHARINDEX('[',@str), CHARINDEX(']',@str) - CHARINDEX('[',@str)+1, '')
end
else
break
end
select @orgStr as input, @newStr as result
正是我在找的東西!!! –
你可以嘗試STRING_SPLIT
,如果您的兼容性級別爲130或更高。 (不是Azure的默認設置,根據文檔,您可能需要更改數據庫範圍的設置。)
如果將字符串拆分爲'[',那麼您將有兩組值:包含']'而那些不是。如果您的字符串包含平衡的左右括號,則第一個單詞不應該有']',因爲它包含第一個開頭'['之前的所有內容。每隔一個字就應該包含一個關閉']'。
您可以刪除第一個單詞,然後在']上再應用STRING_SPLIT
。此時,let's-call-even-even行將成爲索引,並且這些調用它們的奇數行將在']'之後和下一個'['之前成爲文本。
像這樣:
s = 'firstword[1][2] another word [foobar] biscuit'
SELECT VALUE FROM STRING_SPLIT(s, '[')
應該讓你:
1: 'firstword' #<-- No brackets here
2: '1]'
3: '2] another word '
4: 'foobar] biscuit'
可以刪除第一行,當然。再次應用SPLIT_STRING
將讓你:
'1', ''
'2', ' another word'
'foobar', ' biscuit'
保持左側立柱,丟棄右列,和鮑勃是你的叔叔!
感謝幫助+1幫助 –
使用SUBSTRING和CHARINDEX內置函數在CTE:
DECLARE @String VARCHAR(200) = 'A[1]/B2[2]/C_D[1]'
;WITH CTE_Split(SplitStr , String) AS
(
SELECT SUBSTRING(@String
,CHARINDEX('[',@String),CHARINDEX('[',@String)+1),SUBSTRING(@String
,CHARINDEX('/',@String)+1,LEN(@String))
UNION ALL
SELECT CASE WHEN CHARINDEX('[',String) = 0 THEN '' ELSE SUBSTRING(String
,CHARINDEX('[',String),CHARINDEX('[',String)) END,
CASE WHEN CHARINDEX('/',String) = 0 THEN '' ELSE SUBSTRING(String
,CHARINDEX('/',String)+1,LEN(String)) END
FROM CTE_Split
WHERE String <> ''
)
SELECT SplitStr FROM CTE_Split
[OR]
This query for all scenarios :
DECLARE @String VARCHAR(200) = 'A[1]/B2[2]/C_D[1]/C_D[288]/'
;WITH CTE_Split(SplitStr , String) AS
(
SELECT SUBSTRING(@String,0,CHARINDEX('/',@String)),SUBSTRING(@String
,CHARINDEX('/',@String)+1,LEN(@String))
UNION ALL
SELECT CASE WHEN CHARINDEX('/',String) = 0 THEN '' ELSE
SUBSTRING(String ,0,CHARINDEX('/',String)) END,
CASE WHEN CHARINDEX('/',String) = 0 THEN '' ELSE SUBSTRING(String
,CHARINDEX('/',String)+1,LEN(String)) END
FROM CTE_Split
WHERE String <> ''
)
SELECT SUBSTRING(SplitStr,CHARINDEX('[',SplitStr),CHARINDEX(']',SplitStr))
FROM CTE_Split
以DECLARE @String VARCHAR(200)='A [1]/B2 [223]/C_D [1]'失敗。我建議使用']'作爲結尾字符串delimeter而不是'/' –
用DECLARE @String VARCHAR(200)='A [1]/B2 [223]/C_D [1]/E_F'''' –
是的,這隻適用於特定場景.. –
--===== Create and populate the Tally table on the fly
SELECT TOP 11000 --equates to more than 30 years of dates
IDENTITY(INT,1,1) AS N
INTO dbo.Tally
FROM Master.dbo.SysColumns sc1,
Master.dbo.SysColumns sc2
--===== Add a Primary Key to maximize performance
ALTER TABLE dbo.Tally
ADD CONSTRAINT PK_Tally_N
PRIMARY KEY CLUSTERED (N) WITH FILLFACTOR = 100
--===== Allow the general public to use it
GRANT SELECT ON dbo.Tally TO PUBLIC
--===== Simulate a passed parameter
DECLARE @Parameter VARCHAR(8000)
SET @Parameter = 'A[1]/B2[2]/C_D[1]'
--===== Suppress the auto-display of rowcounts to keep them from being
-- mistaken as part of the result set.
SET NOCOUNT ON
--===== Get the items in the brackets and number them
SELECT '[' + SUBSTRING(@Parameter,N+1,CHARINDEX(']',@Parameter,N+1)-N-1) + ']'
FROM dbo.Tally
WHERE N < LEN(@Parameter)
AND SUBSTRING(@Parameter,N,1) = '['
請試試你的邏輯就像這個
謝謝!適合我! –
感謝Piyush ............................................... ................ –
可以通過一個while循環結合子字符串和charindex來完成。
查詢
declare @str as varchar(max) = 'A[1]/B2[2]/C_D[1]';
declare @len as int = len(@str);
declare @i as int = 0;
declare @str2 as varchar(max) = @str;
declare @res as varchar(max) = '';
while(@len >= @i)
begin
if (charindex('[',@str2) <> 0)
begin
set @res += substring(@str2,
charindex('[', @str2, 1),
charindex(']', @str2, 1) - charindex('[', @str2, 1) + 1)
set @i += charindex(']', @str2, 1);
set @str2 = right(@str2, @len - @i)
end
else
break;
end
select @res;
- 1. 保留括號內的文字只有
- 2. 數據與方括號裏面的SQLite數據庫DB
- 3. 從JSON中提取數據時如何保留方括號?
- 4. pyspark sql數據幀只保留爲空
- 5. 在mathml中保留括號
- 6. 只保留數據表的前10行
- 7. 方括號從哪裏來?
- 8. 用firefox保留div裏面的文字
- 9. 只取數字括號內(括號內)
- 10. 在點陣直方圖中如何只保留99%的數據?
- 11. 在調車場保留圓括號
- 12. 刪除括號但保留CDATA不變
- 13. 如何刪除方括號和裏面的任何文本?
- 14. 的JavaScript - 數組轉換爲字符串,同時保留括號
- 15. Preg_Match方括號外的數據
- 16. 如何將數組寫入nodejs中的文件並保留方括號?
- 17. 有方括號的方括號或方括號內
- 18. 只有大括號的方法
- 19. 在sql server中保留單個數據的正確方法?
- 20. 刪除雙方括號並保留字符串
- 21. 只刪除雙引號前,方括號
- 22. 移調數據,只保留需要obs
- 23. 留出在方法調用中括號
- 24. 只刪除括號內的數字(括號)
- 25. 右括號後面的雙括號
- 26. 棧方數據幀,只保留上/下三角
- 27. 如何忽略/保留在裏面blogengine
- 28. SQL在更新後保留數據
- 29. Joomla - {}方括號在哪裏工作?
- 30. 在ASP.NET中保留數據頁面
現在你應該知道,你應該告訴我們你的努力...... –
我已經嘗試做這件事通過PATINDEX,但是這不是動態的..因爲在方括號內數字可以 –