我们的应用程序运行在mysql 5.6.21上,对于每个事务,它都会在日志表中写入一个条目。我感兴趣的主要字段是一个很长的varchar字段,它基本上有传递给应用程序的完整url。此数据字段中可以有任意数量的参数/值对,这些参数/值对由与号和分隔。我正试图想出一种解析它们的方法,以便我们可以报告这些数据。
下面是一个示例记录:
sessionid=longesessionidwecanignore&serverurl=https://www.theurl.com/bla/bla&parameter1=123456789&param2=23456789&par3=987654&p4=abcdef123&parameterlongname6=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, '&parameter1=')+12), (locate('&', ParameterString, instr(ParameterString, '&parameter1=')+12)) -  (instr(ParameterString, '&parameter1=')+12))
from TestLogTable
where ParameterString like '%&parameter1=%';

同样,我不喜欢这个方法,因为它必须用数字12硬编码,因为这是'¶meter1='的长度。
我希望这里的一些sql专家能帮助我使这件事更加动态和自动化??下面的示例sql创建一个包含一些测试数据的测试表。
谢谢您!!
create table TestLogTable (ParameterString varchar(32768));

insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl.com/bla/bla&parameter1=123456789&param2=23456789&par3=987654&p4=abcdef123&parameterlongname6=ABCDEFG');
insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl2.com/bla/bla&parameter5=123456789&param6=23456789&par7=987654&p8=abcdef123&parameterlongname9=ABCDEFG');
insert into TestLogTable (ParameterString) values ('sessionId=LongSessionIdWeCanIgnore&serverurl=https://www.theurl2.com/bla/bla&parameter5=123456123&param6=23456789123&par7=987654123&p8=abcdef123123&parameterlongname9=ABCDEFG123123');

最佳答案

您所寻找的基本上与mysqlGroup_conat()函数相反——与其将一个集合凝聚在一起,不如在分隔符上将其分开。
如果您不知道参数的确切数目,就没有简单的单行查询可以涵盖这一点。如果知道参数的最大数目,可以编写如下代码:SQL split comma separated row
我建议你真正想做的是写一个程序,如果你不知道确切的限制或它可能会改变。
下面是另一个so问题,涉及如何使用存储过程实现此目标:"Reverse GROUP_CONCAT" in MySQL?

10-07 18:56
查看更多