SQL Server 如何从具有不同值的表中提取括号内的数据?

ycl3bljg  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(280)

我试图从一个列中提取数据,该列包含ID和括号中包含ID的字符,它看起来有点像这样(顺便说一句,如果它们碰巧存在于一行中,那么只有一组括号):
| 第1列|
| - ------|
| 马克(1234)|
| 小行星6789|
| VZ(X678)|
| ASD(5677)奎|
| 理想结果|
| - ------|
| 1234|
| 小行星6789|
| 小行星678|
| 小行星5677|
这是我到目前为止所拥有的,但它返回了一个错误:'传递给LEFT或SUBSTRING函数的长度参数无效。'

SELECT DISTINCT col1,
CASE WHEN col1 like '%(%' then
SUBSTRING (col1,
            CHARINDEX('%(%', col1) + 1,
            CHARINDEX('%)%', col1) - CHARINDEX('%(%', col1) - 1)
            else col1 end
from MyTable B;
rdlzhqv9

rdlzhqv91#

如果您对支持多个观察的帮助表值函数感兴趣,如果您不需要该函数,将逻辑迁移到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
e0uiprwp

e0uiprwp2#

@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;

相关问题