我有两列(A, B
)像这样......
A B
12_18_19 20
我想在这样的同一SELECT
语句中添加第三列(C)......
C
12_18_20_19
换句话说,我的列A
由“_”分隔,因此 column 的倒数第二个索引A
应该是 column B
。
如果可能的话,我会在这样的同SELECT
一条语句中完成所有这些......
A B C
12_18_19 20 12_18_20_19
我有两列(A, B
)像这样......
A B
12_18_19 20
我想在这样的同一SELECT
语句中添加第三列(C)......
C
12_18_20_19
换句话说,我的列A
由“_”分隔,因此 column 的倒数第二个索引A
应该是 column 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
有点牵扯,主要也是因为T-SQL没有LASTCHARINDEX()
函数。
第一个表达式将A
列解析到最后一个_
分隔符,并获取之前的所有内容。然后它附加 a_
和 column B
,然后从最后一个分隔符之后抓取所有内容并将其附加。_
A
正如 Andriy M 在他的评论中正确提到的那样:如果A
or B
are NULL
,那么整个结果也是 NULL。如果列是空字符串,或者A
不包含任何_
字符,您可能会收到错误(因为解析将失败)或意外的混乱结果。
在 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
用您的表格替换最后一行