SQL Server запрос на обработку строк - PullRequest
0 голосов
/ 12 июля 2010

У меня есть таблица с множеством URL-адресов, таких как

www.topshop.com
www.shopbop.co.uk
http://www.magickingdom.net
http://www.asos.co.uk

ОБНОВЛЕНИЕ

Необходимо иметь возможность обрабатывать этот URL-адрес

topshop.co.uk

Я хочу иметь возможность вырезать пух так, чтобы он возвращал только

topshop
shopbop
magickingdom
asos

Должен ли я писать ручное исключение для каждого экземпляра?Есть ли умный способ форматирования столбца, чтобы он возвращал все между первыми двумя периодами URL?

Ответы [ 5 ]

1 голос
/ 12 июля 2010

РЕДАКТИРОВАТЬ Это было изменено в соответствии с вашим комментарием.

Это охватывает случаи без субдомена, а также случаи без периодов (которые я считаю просто недействительными).Он также охватывает случаи, когда домен начинается с "www."и включают составной TLD (такой как «.co.uk»).Кроме того, вам нужно будет указать, какие дела вас интересуют.

WITH urls (domain) AS (
    SELECT CASE WHEN url LIKE '%.%.%'
                THEN SUBSTRING(url, CHARINDEX('.', url) + 1, 999)
                WHEN url LIKE '%.%'
                THEN LEFT(url, CHARINDEX('.', url) - 1)
                ELSE url
            END
     FROM (SELECT CASE WHEN url LIKE '%www.%'
                       THEN url
                       WHEN url NOT LIKE '%.%'
                       THEN url
                       ELSE 'www.' + url
                   END url
             FROM (SELECT 'www.topshop.com' url
             UNION SELECT 'www.shopbop.co.uk'
             UNION SELECT 'topshop.co.uk'
             UNION SELECT 'nosubdomain.net'
             UNION SELECT 'nothingwhatsoever'
             UNION SELECT 'http://www.magickingdom.net'
             UNION SELECT 'http://www.asos.co.uk') a
     ) b
)
SELECT CASE WHEN domain LIKE '%.%'
                THEN LEFT(domain, CHARINDEX('.', domain) - 1)
                ELSE domain
            END
  FROM urls

Это вывод.

asos
magickingdom
nosubdomain
nothingwhatsoever
topshop
shopbop
topshop
1 голос
/ 12 июля 2010

Вот обычный способ манипуляции со строками. Я предполагаю, что строка всегда будет содержать две десятичные точки. (Вам нужна только последняя строка, я «нарисовал», как я ее построил.)

DECLARE @Foo varchar(100)

SET @Foo = 'www.topshop.com '
SET @Foo = 'www.shopbop.co.uk '
SET @Foo = 'http://www.magickingdom.net '
SET @Foo = 'http://www.asos.co.uk '


PRINT @Foo

--  Start of string to extract
PRINT charindex('.', @Foo) + 1

--  Extracted string, part 1
PRINT substring(@foo, charindex('.', @Foo) + 1, 100)

--  In extracted string, where do we want to stop
PRINT charindex('.', substring(@foo, charindex('.', @Foo) + 1, 100)) - 1

--  Extracted string
PRINT left(substring(@foo, charindex('.', @Foo) + 1, 100), charindex('.', substring(@foo, charindex('.', @Foo) + 1, 100)) - 1)

Это ясно демонстрирует, что манипуляции со строками SQL могут стать очень уродливыми (если не совсем глупыми), и что @Ian Jacobs прав, вам следует использовать язык, более подходящий для этой задачи.

1 голос
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

Шаг 1. Напишите метод для этого в CLR .
Шаг 2. Установите его на свой сервер sql.
Шаг 3. ???
Шаг 4. Прибыль!

0 голосов
/ 12 июля 2010

Попробуйте что-то вроде этого:

declare @urls table (url varchar(100))

insert into @urls
select 'www.topshop.com'
union
select 'www.shopbop.co.uk'
union
select 'http://www.magickingdom.net'
union
select 'http://www.asos.co.uk'

select 
    left(right(url,len(url)-CHARINDEX('.',url)),CHARINDEX('.',right(url,len(url)-CHARINDEX('.',url)))-1)
from @urls
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...