使用返回值作为CSV的SELECT IN查询

时间:2019-06-10 05:18:04

标签: mysql

我试图在IN查询中使用子查询的结果,以基于第二个表中的某些ID从表中返回一些结果。 Table1的结构并不重要,但Table2会存储以下信息:

other_ID  | members
1         | .10.,.16.,.86.
2         | .32.,.34.

other_ID存储为INT,而members存储为TEXT。我没有创建表结构,但我的理解是,成员以这种格式存储,因为它很难将可变长度的CSV存储在数据库的列中。无论哪种方式,我都无法更改表结构。

我有以下查询:

SELECT * FROM Table1 WHERE
Table1.ID IN (REPLACE((SELECT members FROM Table2 WHERE other_ID = 2), ".", ""));

尽我所能尝试,查询仅会返回members列(即32)中第一个值的值。如果我尝试以下查询:

SELECT * FROM Table1 WHERE Table1.ID IN (32,34);

结果成功返回。

关于我在做什么错的任何想法吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试在此处将REGEXP与联接一起使用:

SELECT t1.*
FROM Table1 t1
INNER JOIN Table2 t2
    ON t2.members REGEXP CONCAT('[[:<:]]', t1.ID, '[[:>:]]')
WHERE
    t2.other_ID = 2;

上面使用的正则表达式逻辑将比较此成员字符串:

.32.,.34.

针对正则表达式,如下所示:

\b34\b

这应该可行,因为members中每个数字周围的逗号/点形成了单词边界。

请注意,最好的长期解决方法是不要以非标准化CSV格式存储数据。

答案 1 :(得分:1)

REPLACE(((从Table2 WHERE other_ID = 2的SELECT成员),“。”,“”)

这将不起作用,因为它将采用单个数字,您必须按如下所示拆分该字符串。 这对我有用

从IS_ACC_ACTIVITY_ERROR_LOGS中选择*,其中ERROR_LOG_ID IN( 选择regexp_substr((SELECT REPLACE(ERROR_DESCRIPTION,'。','')des FROM IS_ACC_ACTIVITY_ERROR_LOGS WHERE ERROR_LOG_ID = 2),'[^,] +',1,rn)为splited_string      从双重      交叉      加入(将rownum选择为rn              从双重           按级别<= 2)连接)