Учитывая этот URL:Как получить определенное значение из URL?
www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html
Значение, между 4-м и 5-слэш. Как получить это значение с помощью SQL Server 2008?
Учитывая этот URL:Как получить определенное значение из URL?
www.google.com/hsisn/-#++#/valuetoretrive/+#(#(/.html
Значение, между 4-м и 5-слэш. Как получить это значение с помощью SQL Server 2008?
В SQL-сервере нет функции для получения значения nth
значения, единственной функцией является CHARINDEX
, которая будет извлекать первый экземпляр после указанной начальной позиции. Таким образом, единственный способ использовать это для каскадного каждое значение найдено, то есть:
"/"
"/"
после первого"/"
после второгоТаким образом, каждый расчет требует результат предыдущего, что, чтобы получить 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;
Спасибо Гарет за вашу любезную помощь –
Хорошая работа и приятные объяснения! –
Если вы не знаете 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-й слах.
Спасибо за тебя тоже Жан –
Какие dbms? (Вероятно, вам понадобится конкретная функциональность продукта здесь ...) – jarlh
Какой url связан с SQL? Вы храните url в базе данных? –
Да URL-адрес, хранящийся в базе данных –