Kristian_dk Ответов: 2

Как обрезать URL, чтобы иметь только путь


Привет ребята
Мне нужна помощь ... правда! Я запускаю SQLserver 2016.

У меня есть таблица, содержащая множество URL-адресов og, которые я хотел бы SELECT и обрезать до другого Колума, имеющего только путь.

Колонна называется REDIRTO а стол называется EVENTLOG а ценности могут быть такими:

mydomain.com/ordering
mydomain.com/shop/cart?23456
mydomain.com/profilepage/126378
us.mydomain.com/extranet
uk.mydomain.com/ordering

То что я хотел бы это colume с первым значением после домена:

ordering
shop
profilepage
extranet
ordering


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

Что я уже пробовал:

Select EVENT_ID, REDIRTO, Right([REDIRTO],LEN([REDIRTO])-CharIndex('/',[REDIRTO])) as PATH
From EVENTLOG

RedDk

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

2 Ответов

Рейтинг:
2

CHill60

Поскольку вы используете SQL Server 2016, вы можете использовать STRING_SPLIT[^] функция для разделения частей текста на символы'/', например

DECLARE @sample varchar(255) = 'mydomain.com/shop/cart?23456'
declare @temp table (id int identity(1,1), part varchar(255))
insert into @temp SELECT value FROM STRING_SPLIT(@sample, '/')
select part from @Temp where id = 2
Если вы не можете использовать STRING_SPLIT то есть и другие примеры UDFs для разделения строк например Как разделить строку по символу с разделителями в SQL Server.............. - SQLServerCentral[^]
Кроме того, вы можете использовать SUB_STRING с CHARINDEX ...хотя это немного некрасиво...
DECLARE @sample varchar(255) = 'mydomain.com/shop/cart?23456'
SELECT LEFT(SUBSTRING(@sample, CHARINDEX('/',@sample) + 1, LEN(@sample)), CHARINDEX('/', SUBSTRING(@sample, CHARINDEX('/',@sample) + 1, LEN(@sample)))-1)


Maciej Los

5ed!

Рейтинг:
1

Maciej Los

Я бы предпочел использовать обобщенное табличное выражение[^]. Видеть:

DECLARE @tmp TABLE(uriaddress varchar(255))

INSERT INTO @tmp (uriaddress)
VALUES('mydomain.com/ordering'),
('mydomain.com/shop/cart?23456'),
('mydomain.com/profilepage/126378'),
('us.mydomain.com/extranet'),
('uk.mydomain.com/ordering')

;WITH CTE AS 
(
	SELECT 1 AS PartNo, LEFT(uriaddress, CHARINDEX('/', uriaddress)-1) AS UriPart, RIGHT(uriaddress, LEN(uriaddress) - CHARINDEX('/', uriaddress)) AS Remainder
	FROM @tmp
	WHERE CHARINDEX('/', uriaddress)>0
	UNION ALL
	SELECT PartNo + 1 AS PartNo, LEFT(Remainder, CHARINDEX('/', Remainder)-1) AS UriPart, RIGHT(Remainder, LEN(Remainder) - CHARINDEX('/', Remainder)) AS Remainder
	FROM CTE
	WHERE CHARINDEX('/', Remainder)>0
	UNION ALL
	SELECT PartNo + 1 AS PartNo, Remainder AS UriPart, NULL AS Remainder
	FROM CTE
	WHERE CHARINDEX('/', Remainder)=0
)
SELECT * --UriPart
FROM CTE 
WHERE PartNo =2

Результат:

PartNo	UriPart	Remainder
2	ordering	NULL
2	extranet	NULL
2	profilepage	126378
2	shop	    cart?23456
2	ordering	NULL


Для получения дополнительной информации о CTE, пожалуйста, смотрите:
С common_table_expression (Transact-SQL) | Microsoft Docs[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]