首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串分隔为名字、姓氏、地址等

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

Stack Overflow用户
提问于 2019-05-02 09:15:41
回答 2查看 60关注 0票数 1

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

‘'Anna公寓9号1153B大南路爱普森奥克兰1050’

‘保罗·坎贝尔公寓123 11 Ongly Ave爱普索姆·奥克兰1050’

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

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

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

代码语言:javascript
复制
declare @firstname varchar(50)
declare @lastname varchar(50)
declare @customername varchar(100)
declare @streetnumber varchar(50)
declare @streetname varchar(50)
declare @customeraddress varchar(50)
EN

回答 2

Stack Overflow用户

发布于 2019-05-02 10:49:33

要做到这一点,一种方法是使用一个函数,并向该函数传递一段要阅读的文本、分隔符和测试。

我使用下面的函数来处理您的需求。

首先-创建一个如下所示的函数

代码语言:javascript
复制
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

然后像这样使用它:

代码语言:javascript
复制
select [dbo].[fnParseString] (11,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050') as first_name

安娜。

代码语言:javascript
复制
 select [dbo].[fnParseString] (10,'','Anna Campbell Flat 9 1153B Great South Road Epsom Auckland 1050')  as last_name

Campbell

你明白了吧..。这只是一种方法..而且不是获取姓名和地址的简单方法,因为地址中可能有更多的空格。Great South和GreatSouth将产生不同的结果。

票数 1
EN

Stack Overflow用户

发布于 2019-05-02 11:05:36

Billy Bob Thornton呢?住在New Plymouth的人呢?仅解析名称是非常困难的;将其与地址结合使用会以指数级增加问题。

您可以使用常见模式(两个单词的名称、一个名称的城市等)编写解析大多数情况的代码,但您仍然需要进行大量的手动清理工作。如果可能的话,我会尝试在问题的核心解决这个问题,获取已经正确分离的数据,而不是试图解析它。要么这样,要么生活在大量的垃圾数据中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55944520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档