2012-09-24 52 views
0

我有兩列(A, B)這樣的....T-SQL的東西列到另一列

A   B 
12_18_19 20 

我想第三列(C)中添加相同SELECT聲明是這樣的...

C 
12_18_20_19 

換句話說,我的專欄A由「_」,所以A柱的倒數第二個指數應B列定界。

如果可能的話,我會做做這一切同樣SELECT聲明這樣的內...

A   B C 
12_18_19 20 12_18_20_19 
+2

如果'什麼B'是空的?如果'A'是空的呢?如果'A'和'B'都是空的呢? –

+2

*爲什麼*是第一個存儲分隔值的列「A」?這通常是一個不好的跡象。 –

+0

12_18_19存儲網站的麪包屑菜單,否則我必須運行遞歸查詢來獲取所有子類別來創建菜單。 – highwingers

回答

4

如何:

SELECT 
    A, B, 
    C = SUBSTRING(A, 1, LEN(A) - CHARINDEX('_', REVERSE(A))) + 
     '_' + B + 
     SUBSTRING(A, LEN(A) + 1 - CHARINDEX('_', REVERSE(A)), 999) 
FROM 
    dbo.YourTable 

這是參與了一下,大多也是因爲沒有LASTCHARINDEX()函數在T-SQL中。

第一表達解析A列到最後_分隔符和在此之前需要的一切。然後附加一個_和列B,然後抓住一切後,從A持續_分離器和追加一條。

Andriy M正確地在他的評論中提到:如果ABNULL,那麼整個結果也是NULL。如果列是空字符串,或者如果A不包含任何_字符,你可能會得到錯誤(因爲解析會失敗)或unexpected, messy results

1

編輯舍甫琴科的分析後,以處理更多的情況。

雖然@Marc_s'答案的作品,這是一個稍微好一點的解決方案

SELECT A,B, stuff(a+' ', len(A)+2- charindex('_',reverse(A)+'_') 
,0, case when A='' then B ELSE B+'_' end) C 
FROM 
(SELECT '12_18_19' A, '20' B) t 

替換最後一行與表

+1

只有當'A'有'_'和'B'不爲空時,@ marc_s的解決方案和你的解決方案似乎才能正常工作。但是,當第一個條件不符合時,我認爲@ marc_s的解決方案[比較優雅地失敗](http://sqlfiddle.com/#!3/d41d8/4625)。 –

+0

@AndriyM感謝您的輸入。我改變了腳本來處理這些情況。如果您發現更多例外,請告訴我。 –

+1

不錯。當'B'爲空時,我正在考慮將'B +'_''改爲'COALESCE(NULLIF(B,')+'_','')'來擺脫額外的'_','A'不是,但這可能不一定是OP想要的,因爲他們已經接受了@ marc_s的解決方案(它也有這個額外的'_'問題)。至於其他可能的邊緣情況,目前無法想到。我首先提到的那些在我看來是唯一需要關注的(當然除了NULL)。所以,處理它們的工作很好! –