mysql - MYSQL 中的 UNNEST 函数类似于 POSTGRESQL

标签 mysql sql arrays

MYSQL 上是否有类似 POSTGRESQL 的“unnest”功能?

查询(PSQL):

select unnest('{1,2,3,4}'::int[])

结果(如表):

 int |
_____|
  1  |
_____|
  2  |
_____|
  3  |
_____|
  4  |
_____|

最佳答案

简答

是的,这是可能的。从技术角度来看,您可以通过一个查询来实现。但问题是 - 很可能,您正试图将一些逻辑从应用程序传递到数据存储。数据存储旨在存储数据,而不是表示/格式化数据,或者更重要的是对其应用一些逻辑。

是的,MySQL 没有数组数据类型,但在大多数情况下这不是问题,并且可以创建架构以适应这些限制。在任何情况下,即使你会以某种方式实现它(比如 - 见下文) - 你以后也无法正确使用该数据,因为它只是结果集。当然,您可以存储它 - 比方说,稍后索引,但这又是应用程序的任务 - 所以要创建该导入。

此外,请确保它不是Jaywalker 案例,所以不要存储分隔符分隔的值,然后再尝试提取它们。

长答案

从技术角度来看,您可以使用 Cartesian product 来做到这一点两个行集。然后使用众所周知的公式:

N = d1x101 + d2x102 + ...

因此,您将能够创建一个“全数字”表并稍后对其进行迭代。该迭代与 MySQL string functions 一起, 可能会引导你到这样的地方:

SELECT 
  data 
FROM (
  SELECT 
    @next:=LOCATE(@separator,@search, @current+1) AS next, 
    SUBSTR(SUBSTR(@search, @current, @next-@current), @length+1) AS data, 
    @next:=IF(@next, @next, NULL) AS marker, 
    @current:=@next AS current 
  FROM 
    (SELECT 0 as i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) as n1    
    CROSS JOIN 
    (SELECT 0 as i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) as n2 
    CROSS JOIN 
    (SELECT 
       -- set your separator here:
       @separator := ',', 
       -- set your string here:
       @data      := '1,25,42,71',
       -- and do not touch here:
       @current   := 1,
       @search    := CONCAT(@separator, @data, @separator), 
       @length    := CHAR_LENGTH(@separator)) AS init
    ) AS joins 
WHERE 
  marker IS NOT NULL

对应的 fiddle 是here .

您还应该注意:这不是一个函数。并且使用函数(我的意思是,用户定义的 CREATE FUNCTION 语句)不可能获得结果行集,因为 MySQL 中的函数不能返回定义的结果集。但是,不能说完全不可能用 MySQL 执行请求的转换。

但请记住:如果您能够做某事,并不意味着您应该去做。

关于mysql - MYSQL 中的 UNNEST 函数类似于 POSTGRESQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27364788/

相关文章:

JavaScript - 生成数组的所有排列

php - 从 MySQL 查询中获取行数组?

mysql - 在 MySQL 中使用复合键更新多行

MYSQL多表更新极慢

php - 在 ubuntu 16.04 上安装 mysql 服务器时出现问题

sql - 为什么 ruby​​ 对字符串数组的排序不同于 sql 顺序(postgres)?

SQLite查询三张表

sql - 如何重组 postgres 表中的记录并永久保存

c++ - 从基类创建对象并将其添加到派生类数组

c++ - 如何返回一维大小未知的二维数组?