我们的应用程序在MySQL 5.6.21上运行,并且对于每个事务,它都会向日志表中写入条目。我感兴趣的主要字段是long varchar字段,它基本上具有传递给我们应用程序的完整URL。此数据字段中可以包含任意数量的参数/值对,它们之间用&符号分隔开来。我试图想出一种方法来解析它们,以便我们可以报告这些数据。SQL使用参数/值对解析长varchar字段
下面是一个例子纪录: 的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需要能够循环遍历,并且对于它看到的每个&符号,请将参数名称(从&到=)以及= sign(from该=到下一个&)。我已经得出了一个参数为“硬编码”的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号被硬编码,因为这是“长& parameter1 ='。
我希望这里的一些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');