RIGHT、LEFT 和 CHARINDEX 未按预期执行

RIGHT, LEFT and CHARINDEX not performing as expected

我正在尝试将格式为 lastname, firstname 的名称列重新排序为 firstname lastname。原始列是 NAME_BAT,我已确认没有前导或尾随 space。这是我的 SQL 代码:

SELECT TOP (100) NAME_BAT
    , LTRIM(RIGHT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)) AS FIRST_NAME
    , RTRIM(LEFT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)) AS LAST_NAME
    , LTRIM(RIGHT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)) + ' ' + RTRIM(LEFT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)) AS NAME_FULL
FROM pitch_aggregate
;

这是输出的屏幕截图:

Output from SQL query

为什么前四行是完美的,然后第 5 行在姓名前包含一个前导逗号和 space,而在第 8 行中,名字的前两个字母被截掉?

我已经测试了你的查询,你确实有一些格式问题。

与其将其拆开,不如尝试使用更简单的替代方法。通过使用 cross applyvalues 构造,您可以抽象出字符串拆分以留下更易于使用的 select 列列表。

select name_bat, f.name FirstName, l.name LastName, Concat_ws(' ',f.name,l.name) Name_full
from t
cross apply (values( Left(name_bat,CharIndex(',',name_bat)-1 )))l(name)
cross apply (values( Replace(name_bat,Concat(l.name,', '),'') ))f(name)

See original and new version example

LTRIM(RIGHT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)) AS FIRST_NAME

假定数据如 Casanova, Bob

CHARINDEX(', ', NAME_BAT) returns 9

RIGHT(NAME_BAT, CHARINDEX(', ', NAME_BAT) - 1)就是最右边的9-1=8个字符,也就是nova, Bob

(你所有的 sample/testing 名字和姓氏几乎一样长。)我猜这不是你真正想要的?

现在,像

SUBSTRING(NAME_BAT, CHARINDEX(', ', NAME_BAT) + 2, 100)

可能就是您要找的。我,我认为这是一个很好的例子,说明了为什么 SQL 不是实现字符串操作的好地方。