基本上,我必须将以下字符串划分到正确的列中:
‘'Anna公寓9号1153B大南路爱普森奥克兰1050’
‘保罗·坎贝尔公寓123 11 Ongly Ave爱普索姆·奥克兰1050’
我认为我所需要做的就是声明变量,将每个变量设置为不同的部分,并插入到正确的列中,我只是不确定如何告诉DB每个部分是什么。
我必须将其插入到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)发布于 2019-05-02 10:49:33
要做到这一点,一种方法是使用一个函数,并向该函数传递一段要阅读的文本、分隔符和测试。
我使用下面的函数来处理您的需求。
首先-创建一个如下所示的函数
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_nameCampbell
你明白了吧..。这只是一种方法..而且不是获取姓名和地址的简单方法,因为地址中可能有更多的空格。Great South和GreatSouth将产生不同的结果。
发布于 2019-05-02 11:05:36
那Billy Bob Thornton呢?住在New Plymouth的人呢?仅解析名称是非常困难的;将其与地址结合使用会以指数级增加问题。
您可以使用常见模式(两个单词的名称、一个名称的城市等)编写解析大多数情况的代码,但您仍然需要进行大量的手动清理工作。如果可能的话,我会尝试在问题的核心解决这个问题,获取已经正确分离的数据,而不是试图解析它。要么这样,要么生活在大量的垃圾数据中。
https://stackoverflow.com/questions/55944520
复制相似问题