【发布时间】:2016-03-05 02:10:50
【问题描述】:
我们的应用程序在 MySQL 5.6.21 上运行,并且对于每个事务,它都会将一个条目写入日志表。我感兴趣的主要字段是一个长 varchar 字段,它基本上具有传递给我们的应用程序的完整 URL。此数据字段中可以包含任意数量的参数/值对,它们由 & 号分隔。我正在尝试想出一种方法来解析它们,以便我们可以报告这些数据。
这是一个示例记录: sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl.com/bla/bla¶meter1=123456789¶m2=23456789&par3=987654&p4=abcdef123¶meterlongname6=ABCDEFG
因此,从这个字段中,我想要一个 SQL 语句/函数,将其分开如下:
Parameter Value
--------------- ----------------------
serverUrl https://www.theurl.com/bla/bla
parameter1 123456789
param2 23456789
par3 987654
p4 abcdef123
parameterlongname6 ABCDEFG
因此,如您所见,此 SQL 需要能够循环,并且对于它看到的每个 & 符号,拉出参数名称(从 & 到 =),以及 = 符号后面的值(从 = 到下一个 &)。我已经为一个参数制定了“硬编码”的 SQL,但我想避免这种情况,因为我们可能有超过 300 个不同的参数,我不想为每个参数编写单独的代码.下面是我迄今为止得到的硬编码的示例 SQL:
select
substr(ParameterString,(instr(ParameterString, '¶meter1=')+12), (locate('&', ParameterString, instr(ParameterString, '¶meter1=')+12)) - (instr(ParameterString, '¶meter1=')+12))
from TestLogTable
where ParameterString like '%¶meter1=%';
同样,我不喜欢这种方法,因为它必须用数字 12 进行硬编码,因为这是 '¶meter1=' 的长度。
我希望这里的一些 SQL 专家可以帮助我让这件事变得更加动态和自动化??下面的示例 SQL 用于创建包含一些测试数据的测试表。
谢谢!!
create table TestLogTable (ParameterString varchar(32768));
insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl.com/bla/bla¶meter1=123456789¶m2=23456789&par3=987654&p4=abcdef123¶meterlongname6=ABCDEFG');
insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl2.com/bla/bla¶meter5=123456789¶m6=23456789&par7=987654&p8=abcdef123¶meterlongname9=ABCDEFG');
insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl2.com/bla/bla¶meter5=123456123¶m6=23456789123&par7=987654123&p8=abcdef123123¶meterlongname9=ABCDEFG123123');
【问题讨论】: