如何使用内置函数从字符串中的随机位置提取子字符串?

时间:2012-10-30 23:47:15

标签: sql sql-server sql-server-2008 tsql

我有以下列方式存储的一系列数据:

Word of various kinds (ANT\username1) and even more words
This is another row, the words are random (ANT\username2)
Thankfully the username only ever shows once (ANT\username1)

上面代表三个单独的行。

此数据的一般流程为:

  • 括号可以出现在文本的任何位置
  • 每个字符串的用户名部分(ANT \ usernamex)只会出现一次
  • 用户名部分之前和之前的文字总是不同的长度。
  • 用户名文字可能并不总是存在

正如您可能已经猜到我需要做的是从每一行获取用户名并且它不存在的位置返回null。不幸的是我不知道如何处理这个问题 - 我已经玩过left()和right()函数,但是我们真的不知道如何解决这个问题。如果任何使用许多函数完成任务的答案都有一个快速的模糊解释逻辑流程(那么我可以阅读文档中的函数来学习),我将不胜感激。

1 个答案:

答案 0 :(得分:1)

请注意数据不符合预期时的具体结果。这适用于格式'(ANT\....)'

-- sample table
create table t(s varchar(max));
insert t select 
'Word of various kinds (ANT\) blank' union all select
'Word of various kinds (ANT) blank' union all select
'Word of various kinds (ANT\ no closing' union all select
'Word of various kinds (ANT\(ANT\me) double up' union all select
'' union all select
'(ANT\' union all select
null union all select
'Word of various kinds (ANT\username1) and even more words' union all select
'This is another row, the words are random (ANT\username2)' union all select
'Thankfully the username only ever shows once (ANT\username1)';

-- Query
select Original = s,
       Extracted = nullif(STUFF(LEFT(s, CharIndex(')',s+')',
                   PatIndex('%(ANT\%', s)) -1), 1,
                   PatIndex('%(ANT\%', s + '(ANT\')+4,''),'')
from t;