2015-08-21 56 views
1

我的表中有一個varchar column,我需要能夠從中間隔離一些文本,以便我可以使用它來查找信息從另一張桌子。從SQL Server中的varchar字段中間分離文本

此列可能包含文本的一個例子是這樣的:

0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000) 

在這個例子中,0A10-Deeside是數據,我們在同一個表的另一列名爲AssetID,並且可以是任何長度的。同樣,從「超出範圍」開始的文本可以是任意長度,但總是以字符串「超出範圍」開始。

這是資產ID和「超出範圍」之間的文本,我需要隔離,(PKG AHU-G37-Pa-A)但我很努力地找到一種方式,因爲這也將是不同的長度,所以使用它的SubString自己是不可能的。

任何方法?我正在使用MS SQL Server 2008

+0

是否所有的行都是這樣的? – Mark

+0

這聽起來像你應該有多列包含你的數據,而不只是一個。這樣你就不需要爲簡單的JOIN/lookup做字符串操作。 – HansLindgren

+0

不,不是所有的行都是這樣的,但我們只會處理那些。 在正常情況下,多列顯然是最有意義的,但在這裏我們基本上試圖解析從第三方系統寫入表中的數據。我們無法控制格式化或哪些數據被傳送(或傳送到哪裏)。 我們試圖提取的數據(我們稱之爲SpecName)很遺憾不是由第三方編寫的,所以我們必須嘗試從這個字符串中提取它。上帝保佑書寫不好的整合;) –

回答

0

這查詢將隔離COL2和文本之間的文本超出範圍

SELECT 
    stuff(substring(col1, 0, charindex(' is out of range', col1)), 1, 
    len(col2) + 1, '') 
FROM yourtable 

結果:

PKG AHU-G37-Pa-A 
+0

在其空格字符上劃分一個字符串是相當不錯的:-) – Shnugo

+0

OP表明,開始(0A10-Deeside)來自同一表中的另一列,並且第三部分總是以相同的短語開始(超出範圍)。我認爲應該使用這些信息... – Shnugo

+0

@Shnugo你是對的,答案已經更新。謝謝 –

1

使用char索引來查找第一個空格和is的位置。將它們反饋回子字符串。 https://msdn.microsoft.com/en-us/library/ms186323.aspx

SELECT SubString(theText,0, FirstSpace),.... 
FROM (
    SELECT CHARINDEX(" ",theText) firstSpace, CHARINDEX(" is",theText) LastSpace, theText 
) AS T 
+0

OP指出,開始(0A10-Deeside)來自同一張表中的另一列,並且第三部分總是以相同的短語開始(超出範圍)。我認爲應該使用這些信息......用空格分隔字符串可能是危險的...... – Shnugo

+0

確實,同樣的方法可以用於比空間更好的更嚴格的限制。我認爲上面的答案足以讓開發人員指出正確的方向。 – Mark

+0

不幸的是,AssetID(所需數據之前的文本)被允許包含空格。對列名AssetID使用CHARINDEX似乎是更好的選擇。 –

0

我愛所有的有趣的東西,你可以用它做的XML類型。也許這種做法是東西給你,因爲它是絕對變量...

DECLARE @test VARCHAR(MAX)='0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)'; 

DECLARE @testXML XML=CAST('<root><r>' + REPLACE(@test,'is out of range','</r><r>') + '</r></root>' AS XML); 

SELECT x.y.value('.','varchar(max)') 
FROM @testXML.nodes('/root/r') AS x(y); 

一些增強挑了這一點一個表,其中一開始是另一列的一部分:

DECLARE @tbl TABLE(testText VARCHAR(MAX),AnotherColumn VARCHAR(MAX)); 

INSERT INTO @tbl VALUES('0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)','0A10-Deeside'); 

SELECT testXML.v.value('/root[1]/r[2]','varchar(max)') 
FROM @tbl AS tbl 
CROSS APPLY 
(
    SELECT CAST('<root><r>' + REPLACE(REPLACE(tbl.testText,'is out of range','</r><r>'),tbl.AnotherColumn,'</r><r>') + '</r></root>' AS XML) 
) AS testXML(v) 
相關問題