仅选择长文本/ varchar的一部分

时间:2013-01-18 19:21:02

标签: sql sql-server-2005

我有一个表notes字段,数据类型为text,在我们的应用程序中是一个特定于该订单的通用记事本。问题是,在旧订单上,这个字段很大且难以处理,因为有些部门输入的数据应该在他们自己的字段中。我们现在正试图尽可能地将这些数据分成实际字段。

notes字段的示例部分:

...
05/12 Serve all $w/check. Ins here. Per recording-RSM  (A-F)-1395   (G-O)-104786        (P-Z)-177015  *Unable to verify Billing/PT recs(07/12 LO)(08/12MH)    

***EXPEDITORS : info I want here

(More junk data here)
...

有没有办法只选择单词EXPEDITORS后面的字符串的其余部分,以帮助输入数据?没有一致的'end'字符或字符串,但将数据放在字段的开头就足够了。

到目前为止我所拥有的:

SELECT id, notes 
FROM table 
WHERE notes LIKE '%EXPEDITOR%'

注意:我知道text数据类型是旧的;如有必要,转换为VARCHAR(MAX)可用于此查询。

编辑:为了澄清,我的理想输出如下:

***EXPEDITORS : info I want here

但它也可以包含随后的所有内容。我主要想要删除关键字EXPEDITOR前面的垃圾。

3 个答案:

答案 0 :(得分:1)

想出来。

SELECT SUBSTRING(notes,
                 PATINDEX('%EXPEDITOR%', notes), 
                (DATALENGTH(notes) - PATINDEX('%EXPEDITOR%', notes))) 
FROM table

这将返回以EXPEDITORS关键字开头的文本。它仍然包含信息之后的其余垃圾,但无论如何它都会正常工作,因为它会被人类读取并输入。

密钥是SUBSTRING函数和DATALENGTH函数(后者是text数据类型所必需的。)

感谢您的帮助。

答案 1 :(得分:0)

使用substr / instr。这些是Oracle查询,但它们可以在任何SQL中使用:

SELECT Substr(str, Instr(str, 'EXPEDITORS :')+Length('EXPEDITORS :')+1 ) str FROM
 (
  SELECT '05/12 Serve all $w/check. Ins here. Per recording-RSM....***EXPEDITORS : More Junk Data is what we want' AS str
    FROM dual
 )
 /

如果你在EXPEDITORS之后总是有':',那么:

SELECT Trim(Substr(str, Instr(str, ':')+1 )) str FROM
(
 SELECT '05/12 Serve all $w/check. Ins here. Per recording-RSM....***EXPEDITORS : More Junk Data is what we want' AS str
 FROM dual
)
/

在这两种情况下,输出都是:

str
--------------------------------
More Junk Data is what we want

答案 2 :(得分:0)

您可以使用substring_index(或substr + instr)+ reverse

实际上,这是查询的演变:

SELECT REVERSE(SUBSTRING_INDEX(REVERSE(data), REVERSE('EXPEDITORS'), 1)) 
FROM yourtable

此查询返回:

: info I want here
(More junk data here)
...

然后:

SELECT SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(REVERSE(data), REVERSE('EXPEDITORS'), 1)), '\n', 1)
FROM yourtable

此查询返回:

: info I want here

结束:

SELECT REPLACE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(REVERSE(data), REVERSE('EXPEDITORS'), 1)), '\n', 1), ': ', '')
FROM yourtable

回归:

info I want here

编辑:在MySQL / Oracle中 SELECT REVERSE(SUBSTR( REVERSE(SUBSTR(数据,INSTR(数据,'EXPEDITORS:')+ LENGTH('EXPEDITORS:'))), LENGTH(SUBSTR(数据,INSTR(数据,'EXPEDITORS:')+ LENGTH('EXPEDITORS:'))) - INSTR(SUBSTR(数据,INSTR(数据,'EXPEDITORS:')+ LENGTH('EXPEDITORS:')) ,'\ n'))) 来自mytable