在具有空值的列中的两个字符'('和')'之间查找值

时间:2019-03-25 13:40:08

标签: sql sql-server

我有一个表名authors。我需要在其名称的末尾提取值,但不包括'('和')'。

enter image description here

我尝试将子字符串与Charindex函数一起使用。

select 
isnull (SUBSTRING(name,CHARINDEX('(',name) +1 ,CHARINDEX(')',name) - CHARINDEX('(',name) - 1), '') as  [Name]
from Authors

但是我收到一条错误消息。

  

第5条消息,状态3,第6行,第537条

     

传递给LEFT或SUBSTRING函数的长度参数无效。

这就是我期望的结果。

enter image description here

4 个答案:

答案 0 :(得分:1)

为您的数据,我会这样做:

select coalesce(replace(stuff(name, 1, charindex('(', name + '(') + 1, ''), ')', ''),
                '') as  [Name]

如示例中所示,假定括号在字符串的末尾。

答案 1 :(得分:0)

在这里,根据您的情况

declare @string varchar(25)
set @string = '(asdfgh)'
SELECT SUBSTRING(@string, 
    charindex('(', @string)+1, 
    charindex(')', @string)-
    charindex('(', @string)-1)

答案 2 :(得分:0)

您可以使用APPLY

select substring(name, tt.startp + 1, (endp - startp) - 1) as Name
from Authors a cross apply
     ( values (charindex('(', name + ')'), charindex(')', name + ')')) 
     ) tt(startp, endp); 

您的Name列在某些地方没有( ... ),因此,您可以添加where子句或显式添加{{1} } ... (放在字符串末尾。

答案 3 :(得分:0)

declare @string nvarchar(25)

set @string ='(asdfgh)'

选择REPLACE(REPLACE(@string,'(',''),')',''),其中@string如'%[(] %% [)]%'

在上面的代码中,我使用正则表达式在(和)之间查找字符串,然后将其替换为空