首页 > 解决方案 > 如果字段中有多个括号,如何在 SQL 中使用 SUBSTRING 和 CHARINDEX 仅返回括号中包含的字段的右侧部分?

问题描述

我有一列包含 varchar 数据的数据,并且我一直在尝试使用 CHARINDEX 和 SUBSTRING 仅返回包含括号的部分:

列数据:'这是一个(示例)'

我使用以下代码从上述数据中返回“示例”:

SELECT SUBSTRING (column,  CHARINDEX('(', column)+1 ,   CHARINDEX(')', column)- CHARINDEX('(', column)-1 )

这很好用,但是,在某些情况下,字段中的数据在两个括号之间多次出现:

- '这(是)一个(例子)'

这意味着我上面的代码返回'is'。在我的数据中,我想要返回的是最右边括号中的数据:

ETC

标签: sqlsql-serversubstringsql-server-2016charindex

解决方案


在您的所有示例中,最后一个字符是). 如果这总是正确的,那么最简单的方法可能是:

select replace(stuff(v.str, 1, len(v.str) - charindex('(', reverse(v.str)) - 1, ''), ')', '')
from (values ('this (is) definitely (not) a (number)')) v(str);

更通用的解决方案是:

select v.str,
       replace(stuff(v2.str, 1, len(v2.str) - charindex('(', reverse(v2.str) + '(') + 1, ''), ')', '')
from (values ('this (is) definitely (not) a (number)'),
             ('this (is) definitely (not) a (number) alas'),
             ('no parens')
     ) v(str) cross apply
     (values (left(v.str, len(v.str) - charindex(')', reverse(v.str) + ')') + 1))) v2(str);

推荐阅读