我想在mysql中提取url的参数

我想在mysql中提取url的参数,mysql,Mysql,我的数据库中有一列,其中包含url的参数值。我希望使用sql查询将这些参数放在不同的列中。我举一个例子: 我现在有了一个名为parameters的列,例如这个值:pOrgNum=j11000&pLanguage=nl&source=homepage 现在我需要三列:pOrgnum | pLanguage | source和我的参数值 问题是我不知道参数的顺序或长度,因此我不能使用例如substring(parameters,9,6)来提取参数pOrgnum。有人能帮帮我吗?我是通过在搜索参数之后

我的数据库中有一列,其中包含url的参数值。我希望使用sql查询将这些参数放在不同的列中。我举一个例子:

我现在有了一个名为parameters的列,例如这个值:
pOrgNum=j11000&pLanguage=nl&source=homepage

现在我需要三列:
pOrgnum | pLanguage | source
和我的参数值


问题是我不知道参数的顺序或长度,因此我不能使用例如
substring(parameters,9,6)
来提取参数
pOrgnum
。有人能帮帮我吗?

我是通过在搜索参数之后取字符串的右边,然后在第一个&之前取结果字符串的左边来实现的

这个处理

  • 如果参数是url中的最后一个(因此后面没有“&”)
  • 如果参数不存在(返回空白)
  • 不同长度的搜索字符串(前提是在所有地方替换“utm_medium”)
这将在名为url的参数中查找“utm_medium”的值:

IF(locate("utm_medium", url)=0, '', LEFT(RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")),IF(locate("&",RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")))=0,length(RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")+1)),locate("&",RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium"))))-1)) utm_medium
要使用,请用字段名查找并替换url,用url参数查找并替换utm_medium


可能效率不高,但完成了任务,在其他地方找不到简单的答案

我通过在搜索参数后取字符串的右侧,然后在第一个&之前取结果字符串的左侧来实现这一点

这个处理

  • 如果参数是url中的最后一个(因此后面没有“&”)
  • 如果参数不存在(返回空白)
  • 不同长度的搜索字符串(前提是在所有地方替换“utm_medium”)
这将在名为url的参数中查找“utm_medium”的值:

IF(locate("utm_medium", url)=0, '', LEFT(RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")),IF(locate("&",RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")))=0,length(RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium")+1)),locate("&",RIGHT(url,length(url)-locate("utm_medium",url)-length("utm_medium"))))-1)) utm_medium
要使用,请用字段名查找并替换url,用url参数查找并替换utm_medium


可能效率不高,但完成了任务,在其他地方找不到简单的答案

有一个MySQL UDF,您可以使用它来完成这项工作,它还处理参数解码和大多数字符编码等

例子

select`get_url_param`('https://www.youtube.com/watch?v=KDszSrddGBc','v');
-- "KDszSrddGBc"

select`get_url_param`('watch?v=KDszSrddGBc','v');
-- "KDszSrddGBc"

select`get_url_param`('watch?v=KDszSrddGBc','x');
-- null

select`get_url_param`('https://www.google.com/search?q=cgo+uint32+to+pointer&rlz=1C1CHBF_enUS767US767&oq=cgo+uint32+to+pointer&aqs=chrome..69i57.12106j0j7&sourceid=chrome&ie=UTF-8','q');
-- "cgo uint32 to pointer"

select`get_url_param`('/search?q=Na%C3%AFvet%C3%A9&oq=Na%C3%AFvet%C3%A9','q');
-- "Naïveté"

免责声明,我是作者。

有一个MySQL UDF,您可以使用它来完成这项工作,它还可以处理参数解码和大多数字符编码等

例子

select`get_url_param`('https://www.youtube.com/watch?v=KDszSrddGBc','v');
-- "KDszSrddGBc"

select`get_url_param`('watch?v=KDszSrddGBc','v');
-- "KDszSrddGBc"

select`get_url_param`('watch?v=KDszSrddGBc','x');
-- null

select`get_url_param`('https://www.google.com/search?q=cgo+uint32+to+pointer&rlz=1C1CHBF_enUS767US767&oq=cgo+uint32+to+pointer&aqs=chrome..69i57.12106j0j7&sourceid=chrome&ie=UTF-8','q');
-- "cgo uint32 to pointer"

select`get_url_param`('/search?q=Na%C3%AFvet%C3%A9&oq=Na%C3%AFvet%C3%A9','q');
-- "Naïveté"

免责声明,我是作者。

如果使用您正在使用的服务器端语言,例如PHP/ASP或Java,这不是更容易处理吗?根据您最近的问题,请查看此处的一些答案:为什么不将数据保存在3列中?对你的情况我会这么做。与1个称为参数的3列称为pOrgnum | pLanguage | source不同。您可以使用正则表达式(或者三个,在本例中,因为您不知道其顺序)。我认为问题是如何使用mysql函数来实现。在您使用的服务器端语言(如PHP/ASP或,根据您最近提出的问题,Java?在这里查看一些答案:为什么不将数据保存在3列中?对你的情况我会这么做。不是1调用参数,而是3列调用pOrgnum | pLanguage | source。你可以使用正则表达式(或者三个,在本例中,因为你不知道顺序)。我认为问题是如何使用mysql函数。