mysql - 如何将 MySQL 中的逗号分隔值拆分为行?
问题描述
我在 MySQL 中有一个函数,它返回一个用逗号分隔的整数值列表,从而形成一个字符串。
例如
MyFunction(23);
退货
----------------------
| MyFunction(23) |
|--------------------|
| 34,45,87,23,1 |
----------------------
这是后端 (Java) 所需的一个简单功能 - 但现在,随着新功能的提出,我需要这些结果用于另一个查询,该查询可能使用IN关键字迭代这些结果,如下所示:
SELECT id, myItemId, myItemValue, myDateTime
FROM
items where id
IN (select MAX(id) from items where myItemId=1
and myItemValue
IN (select MyFunction(123))
group by myItemId);
作为单个 csv 元素,MyFunction(23) 的结果是不可迭代的。如果我可以使用一些Split(MyFunction(23))
会生成如下结果的函数,那么将完全适合我的查询,而无需进行太多更改。
这是我期望的结果:
-----------------------------
| Split(MyFunction(23)) |
|---------------------------|
| 34 |
| 45 |
| 87 |
| 23 |
| 1 |
-----------------------------
要注意的另一件事是 MyFunction() 可能会返回空结果或带有单个元素(并且没有逗号)的结果。
我可以创建一个内置函数或一个简单函数来获得相同的功能吗?
这与 stackoverflow 上的其他问题不同,因为我的要求非常简单,并且推导其他解决方案将是多余的。看起来类似于 split() 函数或非常简单的实现。
解决方案
您可以使用 FIND_IN_SET 函数。例如:
SELECT FIND_IN_SET('34', '34,45,87,23,1'); -- return true
SELECT FIND_IN_SET('34', '34'); -- return true
SELECT FIND_IN_SET('34', ''); -- return false
在您的情况下,SQL 查询将如下所示:
SELECT id,
myItemId,
myItemValue,
myDateTime
FROM items
WHERE id IN
(SELECT MAX(id)
FROM items
WHERE myItemId=1
AND FIND_IN_SET(myItemValue, MyFunction(123))
GROUP BY myItemId);
推荐阅读
- c# - VS IDE 设置,以获得更多代码空间
- oracle - plsql varchar2中的增量函数
- etl - 使用 AWS Glue 将 CSV 转换为 ORC 时如何排除分区?
- php - nginx 不提供 php 但下载
- scala - 是否可以从 spark job 获取集群的物理设置?
- arrays - 如果嵌套对象在所有嵌套对象上的特定属性为 false,则删除父对象
- python - 寻求有关 tensorflow 的帮助“models mobilenet_v1_0.5_128”/“mobilenet_v1_1.0_224”
- java - Java 实现 FileOpener
- swift - 以数组形式获取 Firebase 文档
- ruby - 在字母表中找到一个字符的位置并加密它