2015-04-15 3 views
0

Учитывая этот URL:Как получить определенное значение из URL?

www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html 

Значение, между 4-м и 5-слэш. Как получить это значение с помощью SQL Server 2008?

+1

Какие dbms? (Вероятно, вам понадобится конкретная функциональность продукта здесь ...) – jarlh

+0

Какой url связан с SQL? Вы храните url в базе данных? –

+0

Да URL-адрес, хранящийся в базе данных –

ответ

1

В SQL-сервере нет функции для получения значения nth значения, единственной функцией является CHARINDEX, которая будет извлекать первый экземпляр после указанной начальной позиции. Таким образом, единственный способ использовать это для каскадного каждое значение найдено, то есть:

  • Найти положение 1 "/"
  • Найти позицию следующего "/" после первого
  • Найти положение следующий "/" после второго

Таким образом, каждый расчет требует результат предыдущего, что, чтобы получить 5-возникновение получает довольно запутанна, но не невозможно, если вы используете CROSS APPLY повторно результаты. После того как вы позиция 4 и 5-го появления вы можете использовать SUBSTRING для извлечения текста:

SELECT t.url, 
     Value = SUBSTRING(t.url, p4.Position, p5.Position - p4.Position - 1) 
FROM (SELECT url = 'URL:/www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html') AS t 
     CROSS APPLY (SELECT 1 + CHARINDEX('/', url)) AS p1 (Position) 
     CROSS APPLY (SELECT 1 + CHARINDEX('/', url, p1.Position)) AS p2 (Position) 
     CROSS APPLY (SELECT 1 + CHARINDEX('/', url, p2.Position)) AS p3 (Position) 
     CROSS APPLY (SELECT 1 + CHARINDEX('/', url, p3.Position)) AS p4 (Position) 
     CROSS APPLY (SELECT 1 + CHARINDEX('/', url, p4.Position)) AS p5 (Position); 

ДОБАВЛЕНИЯ

Другого варианта у вас есть, если вы хотите больше гибкости, т.е. получить текст между 50-м и 51-м событиями, заключается в использовании функции разделения. The most efficient way to split strings is with a CLR function, но следующий лучший метод только для T-SQL для этой цели - использовать таблицу чисел, чтобы разделить вашу строку, и в отсутствие этого создать свой собственный, используя сложены CTE.

Предполагаю, что у вас нет таблицы чисел и используйте сложный CTE в интересах полного рабочего примера.

CREATE FUNCTION dbo.Split (@StringToSplit VARCHAR(1000), @Delimiter CHAR(1)) 
RETURNS TABLE 
AS 
RETURN 
( WITH N1 (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) AS t (n)), 
    N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2), 
    Numbers (N) AS (SELECT ROW_NUMBER() OVER(ORDER BY n1.N) FROM N1 CROSS JOIN N2 AS N2) 
    SELECT Position = ROW_NUMBER() OVER(ORDER BY n.N), 
      Value = SUBSTRING(@StringToSplit, n.N, ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringToSplit, n.N + 1), 0), LEN(@StringToSplit)) - n.N) 

    FROM Numbers AS n 
    WHERE SUBSTRING(@Delimiter + @StringToSplit, n.N, 1) = @Delimiter 
); 

Что вы можете назвать довольно просто:

DECLARE @Table TABLE (URL VARCHAR(255) NOT NULL); 
INSERT @Table VALUES ('URL:/www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html'); 
SELECT s.* 
FROM @Table AS t 
     CROSS APPLY dbo.Split(t.URL, '/') AS s; 

Который дает вам:

Position Value 
--------------------- 
1   URL: 
2   www.google.com 
3   hsisn 
4   -#++# 
5   valuetoretrive 
6   +#(#(
7   .htm 

Таким образом, вы можете просто выбрать 5-значение из этого путем добавления ИНЕКЕ .:

DECLARE @Table TABLE (URL VARCHAR(255) NOT NULL); 
INSERT @Table 
VALUES 
    ('URL:/www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html'), 
    ('URL:/www.google.com/hsisn/-#++#/valuetoretrive2/+#(#(/.html'); 
SELECT t.URL, s.Value 
FROM @Table AS t 
     CROSS APPLY dbo.Split(t.URL, '/') AS s 
WHERE s.Position = 5; 
+0

Спасибо Гарет за вашу любезную помощь –

+0

Хорошая работа и приятные объяснения! –

0

Если вы не знаете b Efore рука клыков из URL или значение для получения или слэш позиции вы можете использовать эту snipet

declare @uri varchar(max) = 'URL:/www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html' 

,@startAt int = 0 
,@slashCount int = 0 

while @slashCount < 5 
begin 

    set @startAt = CHARINDEX('/',@uri); 
    set @slashCount = @slashCount + 1; 

    if (@slashCount = 5) 
     set @uri = SUBSTRING(@uri, 0, @startAt) 
    else 
     set @uri = SUBSTRING(@uri, @startAt + 1, LEN(@uri)) 


    -- debug info 
    select @startAt, @slashCount, @uri 
end 

это плохо разлагаются строку, получая слэш позиции, пока не найдете # 4 и # 5 слэш и получить что-нибудь между ними.

ВЫВОД

5   1   www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html 
15   2   hsisn/-#++#/valuetoretrive/+#(#(/.html 
6   3   -#++#/valuetoretrive/+#(#(/.html 
6   4   valuetoretrive/+#(#(/.html 
15   5   valuetoretrive 

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

+0

Спасибо за тебя тоже Жан –

Смежные вопросы