2015-07-20 90 views
0

比方說,我有一個名爲類型爲nvarchar 模塊(最大值)的字符串列,其中認爲構成由下劃線分隔的多個字段的信息。但它也可以有一個隨機格式,不能用下劃線分開。查詢結果集中的返回列子字符串?

"Field1_Field2_Field3_Field4_Field5" 
"Field1_Field2_Field3_Field4_Field5_Field6" 
"Field1_Field2_Field3" 
"RandomString" 

我想構建一個T-SQL查詢,該查詢從該列返回信息等等。如果該列的實例具有隨機格式,則完全以其原始格式返回。如果它是上述第一種格式,則只返回用下劃線分隔的前四個字段。基本上是原始字符串的一個子字符串。

結果集:

"Field1_Field2_Field3_Field4" 
"Field1_Field2_Field3_Field4" 
"Field1_Field2_Field3" 
"RandomString" 

我怎麼會去實現這一目標?我正在考慮一個可以在CLR過程中實現的正則表達式,但我之前沒有和他們合作過。

+0

聽起來像是'I-定期expressions' –

+0

有我的回答解決你的問題的情況下? –

+0

這隻有在模塊屬性恰好具有5個字段時纔有效。 –

回答

2

它可以幫助。

Declare @Input as varchar(50) = 'Field1_Field2_Field3_Field4_Field5' 
    DEClare @Character as CHAR(1) = '_' 
    DECLARE @StartIndex INT, @EndIndex INT 


DECLARE @Output TABLE (ID int IDENTITY(1,1), 
    Item NVARCHAR(1000) 
) 

SET @StartIndex = 1 
IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character 
BEGIN 
SET @Input = @Input + @Character 
END 

WHILE CHARINDEX(@Character, @Input) > 0 
BEGIN 
SET @EndIndex = CHARINDEX(@Character, @Input) 

INSERT INTO @Output(Item) 
SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) 

SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) 
END 

Declare @OutputString as NVARCHAR(1000) = '' 

Select @OutputString = @OutputString + Item + '_' 
from @Output 
where ID < 5 

Select LEFT(@OutputString, LEN(@OutputString) - 1) FinalOutput 
0

它可與CLR程序做,但我寧願做它的前端側。取數據,然後用string.Split('_')處理,例如類似於:

var field = "Field1_Field2_Field3_Field4_Field5"; 
var parts = field.Split('_'); 
if (parts.Length >= 4) 
{ 
    parts = parts.Take(4).ToArray(); 
    Console.WriteLine(string.Join("_", parts)); 
} 
else 
{ 
    Console.WriteLine(field); 
} 
1

這個怎麼樣?這應該適用於您在示例數據中提供的場景。

SELECT CASE 
     WHEN charindex(removeelement, module) - 1 > 0 
      THEN substring(module, 0, charindex(RemoveElement, module) - 1) 
     ELSE module 
     END MagicResult 
FROM (
    SELECT SpecialChar 
     ,module 
     ,reverse(substring(reverse(module), 0, charindex(specialchar, reverse(module), 1))) 'RemoveElement' 
    FROM (
     SELECT substring(module, patindex('%[^a-zA-Z0-9]%', module), 1) 'SpecialChar' 
      ,module 
     FROM test 
     ) rs 
    ) rs 

此外,here is a SQLFiddle以及此代碼如何處理您提供的樣本數據。

相關問題