在MySQL上,是否存在POSTGRESQL中的“unnest”之类的功能?

查询(PSQL):

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

结果(如表所示):
 int |
_____|
  1  |
_____|
  2  |
_____|
  3  |
_____|
  4  |
_____|

最佳答案

简短答案

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

是的,MySQL没有数组数据类型,但是在大多数情况下,这将不是问题,可以创建体系结构以使其符合这些限制。而且无论如何,即使您将以某种方式实现它(例如-参见下文),您也将无法再对该数据进行适当的处​​理,因为它只是结果集。当然,您可以存储它-以便以后再建立索引,但这又是应用程序的任务-因此创建该导入。

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

详细答案

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



因此,您将能够创建“所有数字”表,并在以后对其进行迭代。该迭代与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 - 像POSTGRESQL这样的MYSQL中的UNNEST函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27364788/

10-11 02:42
查看更多