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 apply
和 values
构造,您可以抽象出字符串拆分以留下更易于使用的 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)
拿
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 不是实现字符串操作的好地方。
我正在尝试将格式为 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 apply
和 values
构造,您可以抽象出字符串拆分以留下更易于使用的 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)
拿
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 不是实现字符串操作的好地方。