2012-07-12 57 views
1

我同一個數據庫,在那裏我提取的領域之一是這樣的工作:拆分文本存儲過程

1-117 3-134 3-133 

每個套數代表另一個表中的不同數據集。以1-117爲例,1 =設備ID,117 =設備設置。

我有另一張表格,我需要根據以前的字段提取數據。它有兩列分開設備ID和設置。從本質上講,我需要一種方法,從查詢列1-117,並運行查詢從另一個表中提取數據,其中1和117是兩個單獨的對應列。

那麼,無論如何要拆分這個數字來運行此查詢?

此外,我將如何將這三個數字(1-117 3-134 3-133)分成三個不同的查詢集?

這裏棘手的部分是此列可以有任何數量的集(例如1-117 3-1331-117 3-134 3-133 2-131)。

我在存儲過程中創建這些查詢作爲更大的文檔的一部分來顯示提取的數據。

感謝您的任何幫助。

+2

具有不同含義的數據應該位於不同的列和/或不同的行中。 – Ghost 2012-07-12 23:24:25

+0

有一種方法可以做你想做的事情,但是你應該真正規範你的數據結構 – Ghost 2012-07-12 23:25:47

+0

據我所知。目前的系統非常尷尬。但我只是一名實習生,我不認爲我可以改變它。 – 2012-07-12 23:26:15

回答

1

既然你沒有提供的DB供應商,下面的回答SQL Server和Oracle分別這個問題的兩個職位...

T-SQL: Opposite to string concatenation - how to split string into multiple records

Splitting comma separated string in a PL/SQL stored proc

如果你正在使用一些其他的數據庫管理系統,去尋找「拆分文本」。我幾乎可以保證你不是第一個問你問題的人,而且每個DBMS都有答案。

正如你所說的格式是固定的,你也可以使用SUBSTRING函數做一些簡單的事情。

編輯迴應OP評論...

由於您使用的SQL Server和你說,這些值總是一致的格式,你可以做使用SUBSTRING讓每個簡單的東西部分值並將它們分配給T-SQL變量,然後您可以使用它們來執行任何您想要的操作,例如在查詢的謂詞中使用它們。

+0

第一個鏈接是**這個線程**! – ErikE 2012-07-13 04:08:56

+0

你說得對,我從錯誤的瀏覽器標籤複製/粘貼。我編輯過它。 – Jim 2012-07-13 19:13:27

0

櫃面如果套不超過4增加,那麼你可以使用PARSENAME檢索結果

Declare @Num varchar(20) 
Set @Num='1-117 3-134 3-133' 

select parsename(replace (@Num,' ','.'),3) 

Result :- 1-117 

Now again use parsename on the same resultset 

Select parsename(replace(parsename(replace (@Num,' ','.'),3),'-','.'),1) 

Result :- 117 

如果有4個以上的值,則使用拆分功能

1

假設什麼你說的格式始終是# - ###(正好是1位數,破折號和3位數),這是相當容易的。

WITH EquipmentSettings AS (
    SELECT 
     S.*, 
     Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 5, 1) EquipmentID, 
     Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 3, 3) Settings 
    FROM 
     SourceTable S 
     INNER JOIN master.dbo.spt_values V 
     ON V.Value BETWEEN 1 AND Len(S.AwfulMultivalue)/6 
    WHERE 
     V.type = 'P' 
) 
SELECT 
    E.Whatever, 
    D.Whatever 
FROM 
    EquipmentSettings E 
    INNER JOIN DestinationTable D 
     ON E.EquipmentID = D.EquipmentID 
     AND E.Settings = D.Settings 

在SQL Server 2005+中,此查詢將在該字符串中支持1365個值。

如果數字的長度可能會有所不同,那就更難了。讓我知道。