1

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

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() 函数,但真的不知道如何解决这个问题。如果任何使用多个函数来完成任务的答案能够快速解释逻辑流程(这样我就可以阅读函数的文档来学习),我将不胜感激。

4

1 回答 1

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;
于 2012-10-31T01:01:51.740 回答