[英]How do I extract data within parentheses from a table with different values?
我正在嘗試提取包含 ID 的列中的數據和在括號內包含 ID 的字符。 它看起來有點像這樣(順便說一句,如果它們恰好存在於一行中,則只會有一組括號):
列1 |
---|
馬克(1234) |
6789 |
VZ(X678) |
ASD(5677)qwe |
理想的結果 |
---|
1234 |
6789 |
X678 |
5677 |
這是我到目前為止所擁有的,但它返回了一個錯誤:“傳遞給 LEFT 或 SUBSTRING function 的長度參數無效。”
SELECT DISTINCT col1,
CASE WHEN col1 like '%(%' then
SUBSTRING (col1,
CHARINDEX('%(%', col1) + 1,
CHARINDEX('%)%', col1) - CHARINDEX('%(%', col1) - 1)
else col1 end
from MyTable B;
如果對幫助表值 Function 感興趣,它將支持多個觀察。 如果你不要function,把邏輯遷移到CROSS APPLY
里就小事一樁
例子
Declare @YourTable Table ([Col1] varchar(50)) Insert Into @YourTable Values
('Mark(1234)')
,('6789')
,('VZ(X678)')
,('ASD(5677)qwe')
Select A.*
,NewValue = coalesce(RetVal,Col1)
from @YourTable A
Outer Apply [dbo].[tvf-Str-Extract](Col1,'(',')') B
結果
Col1 NewValue
Mark(1234) 1234
6789 6789
VZ(X678) X678
ASD(5677)qwe 5677
結果
CREATE FUNCTION [dbo].[tvf-Str-Extract-JSON] (@String nvarchar(max),@Delim1 nvarchar(100),@Delim2 nvarchar(100))
Returns Table
As
Return (
Select RetSeq = row_number() over (order by RetSeq)
,RetVal = left(RetVal,charindex(@Delim2,RetVal)-1)
From (
Select RetSeq = [Key]+1
,RetVal = trim(Value)
From OpenJSON( N'["'+replace(string_escape(@String,'json'),@Delim1,'","')+N'"]' )
) C1
Where charindex(@Delim2,RetVal)>1
)
編輯 - 無 TVF
Select A.*
,NewValue = coalesce(RetVal,Col1)
from @YourTable A
Outer Apply (
Select RetSeq = row_number() over (order by RetSeq)
,RetVal = left(RetVal,charindex(')',RetVal)-1)
From (
Select RetSeq = [Key]+1
,RetVal = trim(Value)
From OpenJSON( N'["'+replace(string_escape(Col1,'json'),'(','","')+N'"]' )
) C1
Where charindex(')',RetVal)>1
) B
@martin Smith 感謝您指出通配符的使用。 我將我的代碼更改為此並執行我需要它執行的操作:使用 case when 表達式來查找括號而不考慮位置所以我將 % 通配符保留在那里但如您提到的那樣在 CHARINDEX 中將其取出:
SELECT DISTINCT col1,
CASE WHEN col1 like '%(%' then
SUBSTRING (col1,
CHARINDEX('(', col1) + 1,
CHARINDEX(')', col1) - CHARINDEX('(', col1) - 1)
else col1 end
from MyTable B;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.