簡體   English   中英

如何從具有不同值的表中提取括號內的數據?

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

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM