Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 问题:将自由格式文本字段拆分为两列_Sql_Sql Server_Tsql - Fatal编程技术网

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);