我试图在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);
结果成功返回。
关于我在做什么错的任何想法吗?
答案 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)连接)