选择子字符串 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
我需要 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