如何子字符串和添加范围



我有一个URL需要缩短。我有两种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, LOCATE('/', Page)+1), '-', 1) + 4
ELSE Page
END

但这并没有给我一个正确的结果。这看起来很简单,但我真的无法克服。请帮我解决这个问题,谢谢。

在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, '-', 1), SUBSTR(Page, LOCATE('-', Page), 4))
ELSE Page
END short_Page
FROM tablename 

请参阅演示
结果:

> 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 
SELECT Path,
SUBSTRING(Path FROM 1 FOR LOCATE('-', Path) + 3 * (@format = 2)) AS shortened
FROM test;

格式由/项目/后的数字区分

SELECT Path,
SUBSTRING(Path FROM 1 FOR LOCATE('-', Path) + 3 * (SUBSTRING_INDEX(SUBSTRING_INDEX(Path, '/', 3), '/', -1) IN (12, 3))) AS shortened,
(SUBSTRING_INDEX(SUBSTRING_INDEX(Path, '/', 3), '/', -1) IN (12, 3)) + 1 used_format
FROM test;

调整format 2的值列表。

小提琴

最新更新