MYSQL中的UNNEST函数,如POSTGRESQL

时间:2014-12-08 18:48:07

标签: mysql sql postgresql

是否有类似"不需要的功能"来自MGRQL上的POSTGRESQL?

查询(PSQL):

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

结果(如表):

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

1 个答案:

答案 0 :(得分:7)

简短回答

是的,有可能。从技术角度来看,您可以通过一个查询实现这一目标。但问题是 - 最有可能的是,你试图将一些逻辑从应用程序传递到数据存储。数据存储旨在存储数据,而不是表示/格式化数据,或者甚至更多地应用一些逻辑。

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

另外,请确保它不是 Jaywalker 情况,因此不要存储分隔符分隔值,以后再尝试提取它们。

答案很长

从技术角度来看,您可以使用两个行集中的Cartesian product来完成此操作。然后使用众所周知的公式:

  

N = d 1 x10 1 + d 2 x10 2 + ...

因此,您将能够创建一个“全数字”表,然后再遍历它。该迭代与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

相应的小提琴将是here

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

但请记住: 如果你能做某事,那并不意味着你应该这样做。