首页 > 解决方案 > 在 WHERE 子句中无法识别具有替换的子查询

问题描述

问题是我想将使用子查询的 SELECT 结果放在 A_table A_LIST 列 where 子句中,以便它们可以匹配 A_TABLE 'A_List' 和 B_TABLE 'userList'

一张桌子

+-------+----------+
| A_LOG |  A_List  |
+-------+----------+
| WQ-83 |    a     |
| WQ-82 |    b     |
| WQ-89 |    c     |
| WQ-85 |    d     |
| WQ-86 |    e     |
| WQ-81 |    f     |
+-------+----------+ 

B_TABLE

+----------+--------------------+
| userName |     userList       |
+----------+--------------------+
| A_PERSON | ['a','b','c','d']  |
| B_PERSON | NULL               |
+----------+--------------------+

b.table 数据在一列中看起来像['a','b','c','d'] (column name -> userList] 所以我使用 replace 来解析上下文

SELECT replace(replace(userList,'[',''),']','') from Btable

结果看起来像 --> 'a','b','c','d'并将这个选择查询放在子查询中 A.table 列表列数据看起来像每列中的 a,b,c

SELECT A_List  from A_TABLE where A_List IN(
SELECT replace(replace(userList,'[',''),']','') from B_TABLE
)

但是这个查询结果返回 0 个数据

所以我尝试

SELECT  A_List  from A_TABLE where A_List IN( 'a','b','c','d');

它返回 4 行 -> 这是正确的数据

+-------+----------+
| A_LOG |  A_List  |
+-------+----------+
| WQ-83 |    a     |
| WQ-82 |    b     |
| WQ-89 |    c     |
| WQ-85 |    d     |
+-------+----------+ 

我不知道为什么这个查询失败
什么是最好的方法来完成这个?

标签: mysql

解决方案


您当前的用户列表数据几乎看起来像一个有效的 JSON 数组,除了值应该用双引号而不是单引号。假设您的数据如下所示:

["a","b","c","d"]

然后我们使用以下查询:

SELECT a.A_LOG, a.A_List
FROM A_TABLE a
WHERE EXISTS (SELECT 1 FROM B_TABLE b
              WHERE JSON_SEARCH(b.userList, 'one', a.A_List) IS NOT NULL);

下面演示的屏幕截图

演示


推荐阅读