我有一个表名authors。我需要在其名称的末尾提取值,但不包括'('和')'。
我尝试将子字符串与Charindex函数一起使用。
select
isnull (SUBSTRING(name,CHARINDEX('(',name) +1 ,CHARINDEX(')',name) - CHARINDEX('(',name) - 1), '') as [Name]
from Authors
但是我收到一条错误消息。
第5条消息,状态3,第6行,第537条
传递给LEFT或SUBSTRING函数的长度参数无效。
这就是我期望的结果。
答案 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如'%[(] %% [)]%'
在上面的代码中,我使用正则表达式在(和)之间查找字符串,然后将其替换为空