MySQL从CSV值中删除值,由其他CSV定义

时间:2017-06-10 21:41:48

标签: mysql csv

有一个非常具体的实际情况让我陷入了一个非常具体的MySQL查询问题。我想知道它是否可以在MySQL中完成。

如果我在MySQL数据库中有两列带有CSV值的列。它们代表了一组数字。我想知道我是否可以在查询中“减去”另一组中的一组。

例如,如果A="100, 234, 567, 890"B="100, 123, 567",我想从A中删除B中的所有值;屈服"234, 890"。所以我想只删除A和B中存在的A中的值。值是数字但csv显然是字符串。如有必要,两个csv值都可以按升序排列。

(实际的csv用逗号分隔但没有空格,为了便于阅读,我在这里只添加了空格。)

我知道csv值通常不是可行的方法,但在这种特定情况下它无法帮助。

有一个简单而优雅的解决方案吗?

编辑:如果A中的值的数量被限制(在这种情况下最多为6),我只能使它工作,既不简单也不优雅:

SET @A='1,2,3,4,5';
SET @B='1,3,5,6,8';
SELECT CONCAT_WS(',',
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 1 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',1 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',1 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 2 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',2 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',2 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 3 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',3 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',3 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 4 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',4 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',4 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 5 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',5 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',5 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 6 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',6 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',6 ),',',-1),NULL))

结果:

2,4

可能通过定义一个函数(并在之后删除它们),这可能会更具可读性。

有更好的解决方案吗?

0 个答案:

没有答案