像POSTGRESQL这样的MYSQL中的UNNEST函数
在MySQL上,是否存在POSTGRESQL中的“ unnest”之类的功能?
查询(PSQL):
select unnest('{1,2,3,4}'::int[])
结果(如表所示):
int |_____|
1 |
_____|
2 |
_____|
3 |
_____|
4 |
_____|
回答:
对的,这是可能的。从技术角度来看,您可以通过一个查询来实现。但是问题是-最有可能的是,您正在尝试将一些逻辑从应用程序传递到数据存储。数据存储旨在 存储
数据,而不是表示/格式化数据,或者甚至对其应用某些逻辑。
是的,MySQL没有数组数据类型,但是在大多数情况下,这将不是问题,可以创建体系结构以使其符合这些限制。而且无论如何,即使您能以某种方式实现它(例如-
参见下文),您也将无法再对该数据进行适当的处理,因为它只是结果集。当然,您可以存储它-以便以后再建立索引,但这又是应用程序的任务-创建该导入。
另外,请确保它不是 Jaywalker的 情况,所以不要存储分隔符分隔的值,以后再尝试提取它们。
从技术角度来看,您可以使用两行集的笛卡尔乘积来执行此操作。然后使用一个众所周知的公式:
N = d 1 x10 1 + d 2 x10 2 + …
因此,您将能够创建“所有数字”表,并在之后进行遍历。该迭代与MySQL字符串函数一起,可能会导致您出现以下情况:
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
相应的小提琴将在这里。
您还应该注意:这不是一个功能。而且对于函数(我的意思是,用户定义的withCREATE
FUNCTION语句),不可能获得结果行集,因为MySQL中的函数无法按定义返回结果集。但是,并不是说用MySQL执行请求的转换是完全不可能的。
但是请记住:
以上是 像POSTGRESQL这样的MYSQL中的UNNEST函数 的全部内容, 来源链接: utcz.com/qa/431208.html