2016-03-04 23 views
3

我们的应用程序在MySQL 5.6.21上运行,并且对于每个事务,它都会向日志表中写入条目。我感兴趣的主要字段是long varchar字段,它基本上具有传递给我们应用程序的完整URL。此数据字段中可以包含任意数量的参数/值对,它们之间用&符号分隔开来。我试图想出一种方法来解析它们,以便我们可以报告这些数据。SQL使用参数/值对解析长varchar字段

下面是一个例子纪录: 的sessionId = LongSessionIdWeCanIgnore & 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需要能够循环遍历,并且对于它看到的每个&符号,请将参数名称(从&到=)以及= sign(from该=到下一个&)。我已经得出了一个参数为“硬编码”的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号被硬编码,因为这是“长& parameter1 ='。

我希望这里的一些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'); 

回答

1

你要找什么是基本的mysql Group_conat()功能相反 - 而不是concating在一起的一组,除了打破它的分隔符。

如果您不知道参数的确切数量,则不存在简单的单行查询。如果您知道参数的最大数量,则可以编写如下内容:SQL split comma separated row

我建议你真正想要做的是编写一个程序,如果你不知道确切的限制或它可能会改变。

下面是另一个SO问题,涵盖了如何使用存储过程实现这一点:"Reverse GROUP_CONCAT" in MySQL?