我有两列(A, B
),就像这样......
A B
12_18_19 20
我希望在同一SELECT
语句中添加第3列(C),如此...
C
12_18_20_19
换句话说,我的列A
由“_”分隔,因此列A
的倒数第二个索引应为列B
。
如果可能的话,我会在同样的SELECT
声明中做这一切......
A B C
12_18_19 20 12_18_20_19
答案 0 :(得分: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
它有点牵扯,主要是因为T-SQL中没有LASTCHARINDEX()
函数。
第一个表达式将A
列解析为最后_
个分隔符,并在此之前采取所有操作。然后,它会附加一个_
和一列B
,然后在<{1}} _
A
之后抓取之后的所有并追加它。
Andriy M在评论中正确地提到:如果A
或B
是NULL
,那么整个结果也是NULL。如果列是空字符串,或者A
不包含任何_
个字符,则您可能会收到错误(因为解析会失败)或unexpected, messy results。
答案 1 :(得分:1)
在Andriy的分析之后编辑处理更多情况。
虽然@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
将最后一行替换为您的表格