我有一个投影不好的数据库,它在“1,2,5,10”之类的文本列中有一个 ID 集。我需要得到以相同方式设置的两列的交集。我不喜欢使用 PHP 或其他脚本语言来做,我也不喜欢 MySQL 自定义函数。有没有办法得到逗号分隔符字符串给出的两组的交集?
其实我不需要有完整的交集,我只需要知道两组中是否有相同的数字。如果是,我需要有“1”,如果没有相同的数字,我需要有“0”。
谢谢你。
您可以通过REGEXP
一些巧妙的替换来做到这一点。
认为应该这样做(免责声明:尚未对其进行广泛测试):
SELECT col1,
col2,
CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS regex,
col1 REGEXP CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS intersect
FROM tbl
见http://sqlfiddle.com/#!2/7b86f/3
解释一下:这将转换col2
为正则表达式以匹配col1
. 该(\,|$)
位与逗号或字符串结尾匹配。希望这可以帮助...
Steve 的代码并非在所有情况下都有效。例如,当一个数字可以在另一个数字中找到时,它不起作用。插入 tbl (col1, col2) 值 ('60,61,64,68,73', '14,16,17,18,1'); 稍加调整就可以工作:
SELECT col1,
col2,
CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS regex,
CONCAT(',',col1,',') REGEXP CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS intersect
FROM tbl