2013-01-18 45 views
0

的部分我有一個notes場,數據類型text表,在我們的應用程序是記事本特定的順序通用。問題是,在舊的訂單,本場大而笨重,因爲一些部門進入本來應該在自己的字段中的數據。我們現在試圖儘可能將這些數據分成實際領域。只選擇長文本/ VARCHAR

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後只選擇字符串的餘數,在數據錄入幫助的方法嗎?沒有一致的「結束」字符或字符串,但將數據放在字段的開頭就足夠了。

我到目前爲止有:

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

注:我知道text數據類型是舊的;如果需要,轉換爲VARCHAR(MAX)對於此查詢的目的是可以接受的。

編輯:爲了澄清,我的理想輸出將是如下:

***EXPEDITORS : info I want here 

,但它可以包括遵循以及一切。我主要希望刪除關鍵字EXPEDITOR前面的垃圾。

回答

1

算出來。

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

這將返回以EXPEDITORS關鍵字開頭的文本。它仍然包含信息後面的其餘垃圾,但無論如何這將工作得很好,因爲它會被人類閱讀並進入。

鍵是SUBSTRING函數和DATALENGTH函數(後者是text數據類型所必需的)。

謝謝你的幫助。

0

使用SUBSTR/INSTR。這是甲骨文查詢,但他們會在任何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 
+0

這看起來不像有效的TSQL。 OP在SQL Server上。 –

+0

@Martin,就我所知,INSTR/SUBSTR函數是ANSI SQL的一部分。雙表是Oracle特定的。用你的桌子替換它,它應該工作。在發佈之前,我總是運行/測試我的查詢。在我的腦海裏,我不夠聰明來遏制這種事情。 – Art

+1

我不是OP。但是我可以向你澄清,'Trim','Substr','Instr'都不是SQL Server中的函數。 –

0

你可以用SUBSTRING_INDEX(或+ SUBSTR原音樂)播放+反向

其實,這裏是EVO查詢lution:

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 

WICH返回:

info I want here 

編輯:在MySQL/Oracle的 SELECT REVERSE(SUBSTR( REVERSE(SUBSTR(數據,INSTR(數據,「EXPEDITORS: ')+ LENGTH(' EXPEDITORS: ')), LENGTH(SUBSTR(data,INSTR(data,'EXPEDITORS:')+ LENGTH('EXPEDITORS:'))) - INSTR(SUBSTR(data,INSTR(data,'EXPEDITORS:')+ LENGTH 'EXPEDITORS:')),'\ n'))) FROM mytable

+0

你的方法在SQL Server 2005中有效嗎?我收到錯誤:''SUBSTRING_INDEX'不是一個公認的內置函數名稱.' – bd33

+0

哦,這是MySQL中的一個例子。這個可能在T-SQL中(我無法嘗試): SELECT REVERSE(SUBSTR( REVERSE(SUBSTR(txt,PATINDEX('%EXPEDITORS:%',txt)+ LENGTH('EXPEDITORS:')) ), LENGTH(SUBSTR(txt,PATINDEX('%EXPEDITORS:%',txt)+ LENGTH('EXPEDITORS:'))) - PATINDEX('%\ n%',SUBSTR(txt,PATINDEX('%EXPEDITORS: %',txt)+ LENGTH('EXPEDITORS:'))))) FROM testtext – jbouny