【问题标题】:How To Substring and Add a Range如何子串和添加范围
【发布时间】:2020-09-10 08:26:25
【问题描述】:

我有一个需要缩短的 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

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

【问题讨论】:

  • @Akina 第二种格式呢?这3个字符不仅是CAK
  • @Akina 为第一种格式,/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
  • 这两种格式实际上只是一种格式。那么如何判断每个 URL 应用哪种格式呢?
  • @forpas 除以/item/ 之后的数字。请看看我编辑的问题。

标签: mysql substring


【解决方案1】:

像这样在 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 

请参阅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 

【讨论】:

    【解决方案2】:
    SELECT Path,
           SUBSTRING(Path FROM 1 FOR LOCATE('-', Path) + 3 * (@format = 2)) AS shortened
    FROM test;
    

    格式以/item/后面的数字区分

    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 的值列表。

    fiddle

    【讨论】:

    • 我认为我的问题存在误解。当 URL 以 /item/10/ 开头时,它必须是第一种格式,当它以 /item/12/ 开头时,它必须是第二种格式。也许我会编辑我的问题。
    • @HilmanDhannysworo 当 URL 以 /item/10/ 开头时,它必须是第一种格式,当它以 /item/12/ 开头时,它必须是第二种格式。 不清楚。为什么/item/2/ 表示格式1 而/item/3/ 表示格式2 - 你对这些值只字不提...
    • 抱歉我的解释不清楚。格式由/item/ 后面的数字区分。请看看我编辑的问题。
    • 您能向我解释一下您的查询吗?我的意思是,这显然是一些超出我范围的查询:')
    • Double SUBSTRING_INDEX 提取 /item/ 之后的数字,然后测试是否匹配格式 2 列表。如果它在列表中,则比较给出 TRUE,即 1,否则给出 FALSE,即 0。如果需要格式 2,则在 SUBSTRING 中使用此结果将提取的子字符串长度增加 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2015-07-27
    相关资源
    最近更新 更多