Разделение строки на имя, фамилию, адрес и т. Д. - PullRequest
1 голос
/ 02 мая 2019

По сути, я должен разделить следующие строки на правильные столбцы:

'Анна Кэмпбелл Флэт 9 1153B Great South Road, Эпсом Окленд 1050'

'Пол Кэмпбелл Флэт 123, Онгл-Аве, Эпсом, Окленд, 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 ]

1 голос
/ 02 мая 2019

Один из способов сделать это - использовать функцию и передать этой функции текстовый раздел для чтения, разделитель и тест.

Я использую следующую функцию для таких вещей, как ваше требование ..

Сначала - создайте функцию, подобную следующей

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

Кэмпбелл

Вы поймете идею ... Это всего лишь один из способов сделать это ... и не надежный способ получить имена и адреса, так как у вас может быть больше на меньшеепробелы в адресе. Великий Юг и Великий Южный дадут разные результаты.

0 голосов
/ 02 мая 2019

А как насчет Billy Bob Thornton?Как насчет того, кто живет в New Plymouth?Разбор одних имен очень сложен;объединение этого с адресами увеличивает проблему в геометрической прогрессии.

Вы могли бы написать что-то, что анализирует большинство случаев, используя общие шаблоны (имена из двух слов, города с одним именем и т. д., но выУ меня все еще будет много ручной очистки. Если это вообще возможно, я попытаюсь решить эту проблему в основе проблемы, получая данные, которые уже правильно разделены, а не пытаться их проанализировать.много ненужных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...