将字符串分隔为名字,姓氏,地址等

时间:2019-05-02 01:15:41

标签: sql sql-server

基本上,我必须将以下字符串分成正确的列:

'Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050'

'Paul Campbell Flat 123 11 Ongly Ave Epsom Auckland 1050'

我认为我需要做的就是声明变量,将每个变量设置为不同的部分,然后插入正确的列中,我只是不确定如何告诉数据库每个部分是什么。

我必须将其插入到customer_address字段中,并且需要将其分隔为first_name,last_name,customer_name,street_number,street_name和customer_address。

到目前为止,我所得到的只是变量:

declare @firstname varchar(50)
declare @lastname varchar(50)
declare @customername varchar(100)
declare @streetnumber varchar(50)
declare @streetname varchar(50)
declare @customeraddress varchar(50)

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用一个函数并将该文本的一部分,定界符和测试传递给该函数。

我将以下功能用于您的要求。

首先-创建类似以下的函数

CREATE FUNCTION [dbo].[fnParseString]
(
    @Section SMALLINT,
    @Delimiter CHAR,
    @Text varchar(1000)
)
RETURNS VARCHAR(8000)
AS

BEGIN
    DECLARE @NextPos SMALLINT,
        @LastPos SMALLINT,
        @Found SMALLINT

    IF @Section > 0
        SELECT  @Text = REVERSE(@Text)

    SELECT  @NextPos = CHARINDEX(@Delimiter, @Text, 1),
        @LastPos = 0,
        @Found = 1

    WHILE @NextPos > 0 AND ABS(@Section) <> @Found
        SELECT  @LastPos = @NextPos,
            @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
            @Found = @Found + 1

    RETURN  CASE
            WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
            WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
            ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
        END
END

然后像这样使用它:

select [dbo].[fnParseString] (11,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050') as first_name
  

安娜。

 select [dbo].[fnParseString] (10,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050')  as last_name
  

坎贝尔

您了解这个主意。这只是其中一种方法。并非绝对可靠的获取名称和地址的方法,因为您在一个地址中可能会占用更少的空间。.Great South和GreatSouth将产生不同的结果..

答案 1 :(得分:0)

Billy Bob Thornton呢?住在New Plymouth的人呢?仅解析名称是非常困难的。与地址结合使用会成倍地增加问题。

可以编写一些可以使用常见模式(两个单词的名称,一个名字的城市等)解析大多数情况的内容,但是您仍然需要进行大量手动清理如果可能的话,我将尝试解决问题的核心,获取已经正确分离的数据,而不是尝试对其进行解析。要么要么保留大量垃圾数据。