问题描述
我有一个需要缩短的URL。我有2种格式的URL,第一种是/item/10/0100-
,它在第一个-
处停止,第二种是/item/12/0100-CAK
,在-
之后还需要3个字符。
下面是示例
/item/10/0100-NAU1X010-10-A032 need to be /item/10/0100-
/item/2/0888-ADBACS11101-2-A048 need to be /item/2/0888-
/item/12/0100-CAK101827812018101-12-A034 need to be /item/12/0100-CAK
/item/3/0110-MSS0016-T03-3-A034 need to be /item/3/0110-MSS
我已经尝试过该查询
CASE
WHEN Page LIKE "/item/10%" OR Page LIKE "/item/2/%" THEN CONCAT(SUBSTRING_INDEX(SUBSTR(Page,LOCATE('/',Page)+1),'-',1),"-")
WHEN Page LIKE "/item/12%" OR Page LIKE "/item/3/%" THEN SUBSTRING_INDEX(SUBSTR(Page,1) + 4
ELSE Page
END
但这并不能给我正确的结果。看起来很简单,但我真的无法克服。请帮助我解决这个问题,谢谢。
解决方法
SELECT Path,SUBSTRING(Path FROM 1 FOR LOCATE('-',Path) + 3 * (@format = 2)) AS shortened
FROM test;
格式由/ item /
后的数字区分
SELECT Path,Path) + 3 * (SUBSTRING_INDEX(SUBSTRING_INDEX(Path,'/',3),-1) IN (12,3))) AS shortened,(SUBSTRING_INDEX(SUBSTRING_INDEX(Path,3)) + 1 used_format
FROM test;
调整format 2
的值列表。
在CASE表达式中使用字符串函数,如下所示:
SELECT
page,CASE
WHEN Page LIKE '/item/10%' OR Page LIKE '/item/2/%' THEN
CONCAT(SUBSTRING_INDEX(Page,'-',1),'-')
WHEN Page LIKE '/item/12%' OR Page LIKE '/item/3/%' THEN
CONCAT(SUBSTRING_INDEX(Page,SUBSTR(Page,LOCATE('-',Page),4))
ELSE Page
END short_Page
FROM tablename
请参见demo。
结果:
> page | short_Page
> :--------------------------------------- | :----------------
> /item/10/0100-NAU1X010-10-A032 | /item/10/0100-
> /item/2/0888-ADBACS11101-2-A048 | /item/2/0888-
> /item/12/0100-CAK101827812018101-12-A034 | /item/12/0100-CAK
> /item/3/0110-MSS0016-T03-3-A034 | /item/3/0110-MSS