0

我有一个带有notes字段 datatype的表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)
...

有没有办法只选择 word 之后字符串的其余部分EXPEDITORS,以帮助输入数据?没有一致的“结束”字符或字符串,但将数据放在字段的开头就足够了。

到目前为止我所拥有的:

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

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

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

***EXPEDITORS : info I want here

但它也可以包括以下所有内容。我主要希望删除关键字前面的垃圾EXPEDITOR

4

3 回答 3

1

弄清楚了。

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

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

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

谢谢您的帮助。

于 2013-01-18T23:52:03.643 回答
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(data, INSTR(data, 'EXPEDITORS : ')+LENGTH('EXPEDITORS : '))), LENGTH(SUBSTR(data, INSTR(data, 'EXPEDITORS : ')+LENGTH('EXPEDITORS : '))) - INSTR(SUBSTR(data, INSTR(data, 'EXPEDITORS : ')+LENGTH('EXPEDIORS : ')), '\n'))) 从 mytable

于 2013-01-18T20:02:25.223 回答
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
于 2013-01-18T19:35:49.483 回答