当前位置: 首页 > 面试题库 >

像POSTGRESQL这样的MYSQL中的UNNEST函数

朱硕
2023-03-14
问题内容

在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执行请求的转换是完全不可能的。

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



 类似资料:
  • 问题内容: 当我有一个带有单独值的列时,可以使用以下unnest()函数: 如何包含元素编号?IE: 我想要源字符串中每个元素的原始位置。我试着窗口函数(row_number(),rank()等等),但我总是得到1。也许是因为它们在源表的同一行中? 我知道这是一个不好的表设计。这不是我的,我只是想解决它。 问题答案: Postgres 9.4或更高版本使用WITH ORDINALITY了一组返回功

  • 问题内容: 我想用胶水线加入。有这个功能吗? 问题答案: 从 Java8 开始,可以使用。 产生: 否则,Apache CommonsLang具有一个类,该类具有将数组连接在一起以构成的功能。 例如: 生成以下内容:

  • 问题内容: 代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。还是存在?) 被声明为一个函数。因此,当我将参数传递给它时,它也应该返回结果。 那么,为什么我没有得到第二个警告框? 问题答案: 您会看到一个命名函数表达式(NFE)。 匿名函数表达式是您将没有名称的函数分配给变量1的地方: 命名函数表达式是您将命名函数分配给变量的地方(惊奇!): 函数名称仅在函数本身内可用。这使您无需知

  • 我对RabbitMQ这样的消息代理并不熟悉,我们可以使用它为Celery这样的调度系统创建任务/消息队列。 现在,问题是: > 我可以在PostgreSQL中创建一个表,该表可以添加新任务,并由消费者程序(如Celery)使用。 null Redis也可以用作消息代理吗?我发现它更类似于Memcached,而不是rabbitMQ。 请把这件事说清楚!

  • 是否有机会在MySQL中获得包含varchar的列的(如“500x400”或“800x600”)。它们是框架的大小。 我需要两个数相乘的最大值。500x400=大于200 000。 表如下所示

  • 在与甲骨文合作几年后,我刚搬到PostgreSQL。我一直在研究PostgreSQL数据库应用程序(Java、JDBC)中准备语句的一些性能问题。 Oracle在其SGA中缓存准备好的语句-准备好的语句池在数据库连接之间共享。 PostgreSQL文档似乎没有指出这一点。以下是文档中的片段(https://www.postgresql.org/docs/current/static/sql-pre