我有兩列(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
我有兩列(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
如何:
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正確地在他的評論中提到:如果A
或B
是NULL
,那麼整個結果也是NULL。如果列是空字符串,或者如果A
不包含任何_
字符,你可能會得到錯誤(因爲解析會失敗)或unexpected, messy results。
編輯舍甫琴科的分析後,以處理更多的情況。
雖然@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
替換最後一行與表
只有當'A'有'_'和'B'不爲空時,@ marc_s的解決方案和你的解決方案似乎才能正常工作。但是,當第一個條件不符合時,我認爲@ marc_s的解決方案[比較優雅地失敗](http://sqlfiddle.com/#!3/d41d8/4625)。 –
@AndriyM感謝您的輸入。我改變了腳本來處理這些情況。如果您發現更多例外,請告訴我。 –
不錯。當'B'爲空時,我正在考慮將'B +'_''改爲'COALESCE(NULLIF(B,')+'_','')'來擺脫額外的'_','A'不是,但這可能不一定是OP想要的,因爲他們已經接受了@ marc_s的解決方案(它也有這個額外的'_'問題)。至於其他可能的邊緣情況,目前無法想到。我首先提到的那些在我看來是唯一需要關注的(當然除了NULL)。所以,處理它們的工作很好! –
如果'什麼B'是空的?如果'A'是空的呢?如果'A'和'B'都是空的呢? –
*爲什麼*是第一個存儲分隔值的列「A」?這通常是一個不好的跡象。 –
12_18_19存儲網站的麪包屑菜單,否則我必須運行遞歸查詢來獲取所有子類別來創建菜單。 – highwingers