mysql - 在 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 |
+-------+----------+
我不知道为什么这个查询失败
什么是最好的方法来完成这个?
解决方案
您当前的用户列表数据几乎看起来像一个有效的 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);
演示
推荐阅读
- mysql - mysql查询查找'+1x'不等于'x'的所有行,忽略+1
- java - Apache Cayenne defaultCatalog 由环境变量设置
- symfony - 如何在本地将自定义字体加载到 symfony 项目中?
- node.js - 无法获取路径:/{proxy+} 工作(无服务器离线)
- node.js - 如何使用 discord.js 获取频道主题
- azure - 每次在 Office 365 中创建会议时,如何运行 Azure 函数?
- azure - TFS 2017 更新 3 到 Azure Dev Ops
- node.js - 我正在用 index.js 和 .env 编写 Discord bot,在终端“node index.js”中运行它时遇到了这个错误
- java - PowerMock 不会模拟静态方法以在 Spring-Boot 应用程序中引发异常
- java - 如何在 Android recyclerview 中阻止搜索过滤器不断崩溃