基于条件提取T-SQL中的子字符串

基于条件提取T-SQL中的子字符串,sql,sql-server,Sql,Sql Server,我在sql列中有地址,该列还包含邮政编码,即以下格式 10 westminister way Road, London (NW10 5NQ) 但并不是所有的记录都有邮政编码,在这种情况下会是这样的 10 westminister way Road, London 我需要提取字符串,这是工作正常,除了以下字符抛出错误,如果邮政编码不存在,我认为我需要使用包含,但不知道如何修改现有的代码这样做 select ,REVERSE(SUBSTRING(REVERSE([address]),2, C

我在sql列中有地址,该列还包含邮政编码,即以下格式

10 westminister way Road, London (NW10 5NQ)
但并不是所有的记录都有邮政编码,在这种情况下会是这样的

 10 westminister way Road, London
我需要提取字符串,这是工作正常,除了以下字符抛出错误,如果邮政编码不存在,我认为我需要使用包含,但不知道如何修改现有的代码这样做

select 
,REVERSE(SUBSTRING(REVERSE([address]),2, CHARINDEX('(', REVERSE([address]))-2)) PostCode
,CHARINDEX('(', REVERSE([address]))-2 indexDetail
我的问题是如何使用contain或if条件

 if(CHARINDEX('(', REVERSE([address])) = true then proceed with substring
 else ignore record
这个怎么样

select (case when address like '% (%)'
             then left(right(address, 9), 8)
        end) as postcode

使用
IIF
。这将抓住括号中的所有内容,不管邮政编码有多长。我不确定它们在英国是否有所不同

declare @table table ([address] varchar(256))
insert into @table
values
('10 westminister way Road, London (NW10 5NQ)'),
('10 westminister way Road, London')

select
    [address],
    PostCode = iif(charindex('(',[address]) > 1, substring([address],charindex('(',[address]),charindex(')',[address])),''),
    PostalNoParan = iif(charindex('(',[address]) > 1, replace(replace(substring([address],charindex('(',[address]),charindex(')',[address])),'(',''),')',''),'')
from @table
如果需要空字符串而不是
NULL

SELECT 
  [address], 
  PostalCode = COALESCE(SUBSTRING([address], NULLIF(charindex('(',[address]),0), 256),'') 
FROM @table;

比我的短得多,扭转了规则的例外。SMRT
SELECT 
  [address], 
  PostalCode = COALESCE(SUBSTRING([address], NULLIF(charindex('(',[address]),0), 256),'') 
FROM @table;