Sql 问题:将自由格式文本字段拆分为两列
我有一个列,其中包含需要拆分为两个独立列的客户机的名字和姓氏。然而,由于这是一个自由格式的文本字段,我无法控制有人在其中键入什么。我之前做了以下操作,以进行拆分:Sql 问题:将自由格式文本字段拆分为两列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个列,其中包含需要拆分为两个独立列的客户机的名字和姓氏。然而,由于这是一个自由格式的文本字段,我无法控制有人在其中键入什么。我之前做了以下操作,以进行拆分: SELECT LEFT(client_name, CHARINDEX(' ', client_name) -1 ) AS FirstName RIGHT(x_amr_kpi_past_clients.past_client_name, CHARINDEX(' ', REVERSE(x_amr_kpi_past_clients.pa
SELECT
LEFT(client_name, CHARINDEX(' ', client_name) -1 ) AS FirstName
RIGHT(x_amr_kpi_past_clients.past_client_name, CHARINDEX(' ',
REVERSE(x_amr_kpi_past_clients.past_client_name)) -1) AS LastName
FROM Clients
问题是有人只输入了没有空格的“s”。有没有一种方法可以清理数据,这样如果再次发生这种情况,它只会返回NULL?我不会就此评论您的代码,也不会评论它的工作频率。您可以通过在
charindex()
调用中添加额外的空间来消除错误:
CHARINDEX(' ', client_name + ' ')
如果我理解正确,这里有两种方法 这只是猜测,因为没有样本数据和预期结果 1-使用
CASE
表达式
SELECT S,
CASE WHEN CHARINDEX(' ', S) > 0
THEN LEFT(S, CHARINDEX(' ', S) - 1)
ELSE S
END FirstName,
CASE WHEN CHARINDEX(' ', S) > 0
THEN SUBSTRING(S, CHARINDEX(' ', S)+1, LEN(S)- (CHARINDEX(' ', S)-1))
ELSE NULL
END LastName
FROM
(
VALUES
('First Name'),
('Name'),
('S')
) T(S);
2-使用PARSENAME()
示例数据和预期结果在这里会有所帮助。您可能还想看一看parsename()或string_split()。最好的方法是在UI中拆分这些数据,并使它们都是必需的。像您现在这样在后端执行此操作容易出现各种问题。我建议您阅读这篇关于在数据库中存储名称的文章。这非常有用!我以前不知道PARSENAME()函数。谢谢
SELECT S,
PARSENAME(REPLACE(S, ' ', '.'), 1) FirstName,
PARSENAME(REPLACE(S, ' ', '.'), 2) LastName
FROM
(
VALUES
('First Name'),
('Name'),
('S')
) T(S);