基本上,我必须将以下字符串分成正确的列:
'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)
答案 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
的人呢?仅解析名称是非常困难的。与地址结合使用会成倍地增加问题。
您可以编写一些可以使用常见模式(两个单词的名称,一个名字的城市等)解析大多数情况的内容,但是您仍然需要进行大量手动清理如果可能的话,我将尝试解决问题的核心,获取已经正确分离的数据,而不是尝试对其进行解析。要么要么保留大量垃圾数据。