选择子字符串 SQL

Selecting Substring SQL

我需要 select 在 () 之间找到的子字符串。开始和结束位置以及子字符串的长度会有所不同。我在以下方面取得了一定的成功,但不是 100%。

它适用于某些值但不适用于其他值,它 return 空白并且还会更改值的大写格式,换句话说,如果值是 'TEST' 它将显示为 'Test'.

SELECT SUBSTRING(columnName, CHARINDEX('(', LEN(columnName)),
CHARINDEX(')', columnName) - CHARINDEX('(',columnName)) AS INPUT
FROM tableName

更新只有一组括号()

如果您只出现一次 ():

,这将有效
SELECT 
    SUBSTRING(columnName, 
              CHARINDEX('(', columnName)+1, 
              CHARINDEX(')', columnName) - CHARINDEX('(', columnName)-1)
FROM tableName

如果您的值没有任何 (...) 内容,请添加此 where 子句:

WHERE    CHARINDEX('(', columnName) > 0 AND 
         CHARINDEX(')', columnName) > CHARINDEX('(', columnName)

在 Postgres 中,您可以使用 POSIX 正则表达式捕获来做到这一点:

=> select substring('This (might) work' from '[(](.*)[)]');
 substring 
-----------
 might

看来 SQL 服务器确实提供 regexp support,但我不熟悉它,而且我没有 运行 测试用例的平台。这个特殊的例子很棘手,因为你必须正确引用分隔符 ()

占无、嵌套或不完整()

;with t(f) as (
    select 'aaa(bbb)ccc' union
    select 'aaa(bbbccc' union
    select 'aaabbb)ccc' union
    select 'aaa()ccc' union
    select '(aaa(?))ccc'
)

select f,
case when patindex('%(%)%', f) > 0 
    then substring(f, charindex('(', f ) + 1, (len(f) - charindex(')', reverse(f))) - charindex('(', f )) 
    else ''
end
from t

>>

f             (No column name)
aaa()ccc    
aaa(bbb)ccc   bbb
(aaa(?))ccc   aaa(?)
aaa(bbbccc  
aaabbb)ccc