换句话说,我的 A 列是以"_"为界,所以 A 列的倒数第二个索引应该是 B 列。

如果可能的话,我想在同一个 SELECT 语句中完成所有这些工作,就像这样......

A         B    C
12_18_19  20 12_18_20_19
3 个评论
如果B是空的呢?如果A是空的呢?如果AB都是空的呢?
为什么 A列首先要存储分隔的数值?这通常是一个不好的信号。
12_18_19存储了网站的面包屑菜单,否则我必须运行递归查询来获得所有子类别以创建菜单。
sql-server-2008
tsql
highwingers
highwingers
发布于 2012-09-24
2 个回答
marc_s
marc_s
发布于 2012-09-25
已采纳
0 人赞同
SELECT 
    A, B, 
    C = SUBSTRING(A, 1, LEN(A) - CHARINDEX('_', REVERSE(A))) +
'_' + B +
SUBSTRING(A, LEN(A) + 1 - CHARINDEX('_', REVERSE(A)), 999)
    dbo.YourTable 

这有点复杂,主要也是因为T-SQL中没有LASTCHARINDEX()函数。

第一个表达式解析了A列,直到最后一个_分隔符,并取走之前的所有内容。然后它附加一个_B列,然后从A列的最后一个_分隔符之后抓取所有内容并附加。

Andriy M在他的评论中正确地提到:如果ABNULL,那么整个结果也是NULL。如果列是空字符串,或者A不包含任何_字符,你可能会得到错误(因为解析会失败)或意外的、混乱的结果

t-clausen.dk
t-clausen.dk
发布于 2012-09-25
0 人赞同

经过Andriy的分析,编辑后处理了更多情况。

虽然@Marc_s的答案可行,但这是一个稍好的解决方案

SELECT A,B, stuff(a+'  ', len(A)+2- charindex('_',reverse(A)+'_')