首页 > 解决方案 > 如何将 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() 函数或非常简单的实现。

标签: mysqlsqlstringfunction

解决方案


您可以使用 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);

推荐阅读