MySQL在两个字符串字段之间获得差异

时间:2013-11-27 15:42:12

标签: mysql sql

全部,  我有一个包含两个字段oldnew的mySQL表。每个都包含以下格式的字符串:

key1=value1, key2=value2, key3=value3

行的每个字段中使用的键是相同的,值可能会更改。对于每一行,键可能不同。

是否可以再使用两列来比较oldnew中的值,并仅输出那些不同的键/值对?

old                          | new                          | diff_old          | diff_new
key1=xxx, key2=yyy, key3=zzz | key1=xxx, key2=aaa, key3=zzz | key2=yyy          | key2=aaa
keya=xxx, keyb=yyy, keyc=zzz | keya=111, keyb=yyy, keyc=222 | keya=xxx, keyc=zzz| keya=111, keyc=222

我知道SUBSTRING_INDEX可以用来分割字符串,但问题是行之间的键/值对不同,这意味着函数不能很容易地被烹饪。

1 个答案:

答案 0 :(得分:0)

使用以下查询,它可以为您提供准确的结果。我仔细检查了我的结果:

表格结构:

CREATE TABLE `try` (
  `old` varchar(200) DEFAULT NULL,
  `new` varchar(200) DEFAULT NULL,
  `old_diff` varchar(200) DEFAULT NULL,
  `new_diff` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

查询:

SELECT CONCAT(IF(aa.first_string!=aa.first_string1,first_string,''),
IF(aa.middle_string!=aa.middle_string1,middle_string,'') ,
IF(aa.last_string!=aa.last_string1,last_string,'') ) AS first_result, 
CONCAT(IF(aa.first_string!=aa.first_string1,first_string1,''), 
IF(aa.middle_string!=aa.middle_string1,middle_string1,'') ,
IF(aa.last_string!=aa.last_string1,last_string1,'') ) AS second_result
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(`old`, ',', 1), ',', -1) 
AS first_string,   
IF(  LENGTH(`old`) - LENGTH(REPLACE(`old`, ',', ''))>1, 
SUBSTRING_INDEX(SUBSTRING_INDEX(`old`, ',', 2), ',', -1) ,NULL) AS middle_string,
SUBSTRING_INDEX(SUBSTRING_INDEX(`old`, ',', 3), ',', -1) AS last_string,
SUBSTRING_INDEX(SUBSTRING_INDEX(`new`, ',', 1), ',', -1) AS first_string1,
IF(  LENGTH(`old`) - LENGTH(REPLACE(`new`, ',', ''))>1, 
SUBSTRING_INDEX(SUBSTRING_INDEX(`new`, ',', 2), ',', -1) ,NULL) AS middle_string1,
SUBSTRING_INDEX(SUBSTRING_INDEX(`new`, ',', 3), ',', -1) AS last_string1 
FROM try ) aa