从选择MySQL的URL中提取ID

时间:2019-02-22 09:49:07

标签: mysql

我有一个表,可以说数据。

数据表包含id和url。

id  url
1   https://gourmet.com/detail/12345/?where=tokyo 
2   https://dental-clinic.com/source/detail/4123/?site_code=tokyo
3   https://dental-hospital.com/detail/index/sdf2344/?where=tokyo
4   https://gourmet.com/detail/234ff/?where=tokyo
5   https://dental-clinic.com/source/detail/4123ss/?site_code=tokyo
6   https://gourmet.com/detail/43543//?where=tokyo 

我只想在选择过程中获取URL内的ID。就像我已经有了regex模式一样,但是我想知道如何在“ SELECT” mysql部分上使用它。

我有3个网址格式。

注意:网址中的ID是字母数字。

注意:某些网址是这样的。远端有双斜杠:

https://gourmet.com/detail/12345//?where=tokyo

所需的输出:

id  api_id  url
1   12345   https://gourmet.com/detail/12345/?where=tokyo 
2   4123    https://dental-clinic.com/source/detail/4123/?site_code=tokyo
3   sdf2344 https://dental-hospital.com/detail/index/sdf2344/?where=tokyo
4   234ff   https://gourmet.com/detail/234ff/?where=tokyo
5   4123ss  https://dental-clinic.com/source/detail/4123ss/?site_code=tokyo
6   43543   https://gourmet.com/detail/43543//?where=tokyo 

select sql应该看起来像这样:

SELECT (regex?) as api_id, id, url FROM data;

2 个答案:

答案 0 :(得分:1)

我们可以使用两个链式调用GET /api/v4/projects/my_namespace%2Fmy_app 来处理此问题:

SUBSTRING_INDEX

enter image description here

Demo

使用SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(url, '/', -2), '/', 1) AS api_id, url FROM yourTable; 首次调用SUBSTRING_INDEX会从URL中删除所有内容,但最后一个路径元素和查询字符串除外。使用-2进行的第二次调用将删除查询字符串,并为我们保留API ID。

根据下面的评论,如果有时路径分隔符显示为两个正斜杠,则只需将所有1替换为一个//正斜杠:

/

答案 1 :(得分:0)

强力解决方案应类似于:

  1. 反转字符串(即url)
  2. 获取第一位数的索引
  3. 获取第一个数字的索引与找到'/'之间的子字符串!
  4. 现在,检查生成的子字符串是否包含在主字符串(url)中

    4.1。如果您在string(url)内找到了子字符串,只需放在桌子上

    4.2。否则,反转子字符串并放在桌子上

  5. 退回餐桌

解决方案:

CREATE FUNCTION MyFunction (@Url VarChar(1000))
RETURNS @TableName TABLE (Id Int Identity(1,1), apt_id VarChar(30), urlName 
VarChar(1000))
AS
BEGIN;
   Set @url = Reverse(@Url)
   Declare @i as Int = 1
   Declare @j as Int = 0
   While(Ascii(Substring(@Url, @i, 1)) >=48)
   Begin
      Set @i = @i +1
   End
   Set @j = @i + 1
   While(Ascii(Substring(@url, @j, 1)) != 47)
   Begin
     Set @j = @j +1
   End

   If((CharIndex(SubString(@Url, @i+1, @j-@i-1), @Url) = 1))
   Begin 
      Insert @TableName
      Select Substring(@Url, @i+1, @j-@i-1), @Url
   End
   Else
   Begin
      Insert @TableName
      Select Reverse(Substring(@Url, @i+1, @j-@i-1), @Url)
   End
 RETURN;
END;