转换 unnest() 结果时 NULL emements 丢失

2023-11-27

我偶然发现了非常奇怪的行为unnest(),在扩展数组后进行转换时。

介绍

使用 unnest() 可以使用三种基本语法变体:

1) SELECT unnest('{1,NULL,4}'::int[]) AS i;
2) SELECT i FROM unnest('{2,NULL,4}'::int[]) AS i;
3) SELECT i FROM (SELECT unnest('{3,NULL,4}'::int[])) AS t(i);

所有这些都包含一行NULL结果如预期

 i
---
 1
(null)
 4

要将数组元素转换为另一种类型,可以将elements到基本类型的权利扩大后数组,或投射array本身为不同的数组类型扩展前。第一个变体对我来说似乎稍微简单和简短:

A) SELECT unnest('{4,NULL,1}'::int[])::text;
B) SELECT unnest('{4,NULL,2}'::int[]::text[]);

 i
---
 4
(null)
 1

奇怪的行为

所有组合都可能,除了2A)

由于某种原因无法结合2) with A)

SELECT * FROM unnest('{2,NULL,1}'::int[])::text;

错误:“::”处或附近的语法错误

我可以接受。由于某种原因尚未实施的罕见极端情况。
不过,所有其他组合都可以:

1A) SELECT unnest('{1,NULL,1}'::int[])::text AS i;
2A)SELECT i FROM unnest('{2,NULL,1}'::int[])::text AS i;罢工>
3A) SELECT i FROM (SELECT unnest('{3,NULL,1}'::int[])::text) AS t(i);
1B) SELECT unnest('{1,NULL,2}'::int[]::text[]) AS i;
2B) SELECT i FROM unnest('{2,NULL,2}'::int[]::text[]) AS i;
3B) SELECT i FROM (SELECT unnest('{3,NULL,2}'::int[]::text[])) AS t(i);

与上面的结果相同。

行为真的很奇怪

以下意见涉及A)只。人们可以通过替换来避免这个问题B).

正如所料,我们看到了NULL数组中的元素产生一行NULL到目前为止所有查询的价值。然而,当转换结果时,情况并非如此some数组类型为some基本类型。

这里的行是NULL值突然消失 (!):

SELECT unnest('{1,NULL,4}'::int[])::int8;

 i
---
 1
 4

Examples

我去看兔子洞有多深。这里有些例子:

NULL消失:

SELECT unnest('{1,NULL,1}'::int[])::int2;
SELECT unnest('{1,NULL,2}'::int[])::int8;
SELECT unnest('{1,NULL,3}'::int[])::real;
SELECT unnest('{1,NULL,4}'::int[])::float8;
SELECT unnest('{1,NULL,5}'::int[])::numeric;
SELECT unnest('{1,NULL,6}'::numeric[])::int2;
SELECT unnest('{1,NULL,7}'::numeric[])::int8;
SELECT unnest('{1,NULL,8}'::numeric[])::real;
SELECT unnest('{1,NULL,9}'::numeric[])::float8;
SELECT unnest('{1,NULL,a}'::text[])::char;
SELECT unnest('{1,NULL,b}'::text[])::char(1);
SELECT unnest('{1,NULL,c}'::text[])::varchar(10);      -- !!!
SELECT unnest('{1,NULL,d}'::varchar[])::varchar(10);   -- !!!
SELECT unnest('{2013-1-1,NULL,2013-1-1}'::date[])::timestamp;
SELECT unnest('{2013-1-1,NULL,2013-1-1}'::timestamp[])::date;
SELECT unnest('{23:11,NULL,23:11}'::time[])::interval;
SELECT unnest('{23:11,NULL,23:11}'::interval[])::time;

NULL stays:

SELECT unnest('{1,NULL,1}'::int[])::int4;    -- is really from int to int
SELECT unnest('{1,NULL,2}'::int[])::text;
SELECT unnest('{1,NULL,3}'::int8[])::text;
SELECT unnest('{1,NULL,4}'::numeric[])::text;
SELECT unnest('{1,NULL,5}'::text[])::int;
SELECT unnest('{1,NULL,6}'::text[])::int8;
SELECT unnest('{1,NULL,7}'::text[])::numeric;
SELECT unnest('{1,NULL,8}'::text[])::varchar;    -- !!!
SELECT unnest('{1,NULL,9}'::varchar[])::text;    -- !!!
SELECT unnest('{2013-1-1,NULL,2013-1-1}'::date[])::text;
SELECT unnest('{2013-1-1,NULL,2013-1-1}'::text[])::date;
SELECT unnest('{23:11,NULL,23:11}'::time[])::text;
SELECT unnest('{23:11,NULL,23:11}'::text[])::time;

这似乎令人无法接受。

在测试了相当多的组合之后,模式似乎是:

相关类型之间的转换会导致NULL元素丢失。
不相关类型之间的转换会导致NULL被保留的元素。
除了那个varchar[] -> text反之亦然,就否定了我的这个小假设。或者varchar and text与我想象的不同。

使用 PostgreSQL 9.1 和 9.2 进行测试。相同的结果。
-> SQLfiddle

问题

我在这里错过了什么吗?有人可以解释这种行为吗?
如果没有,问题就变成:我应该继续提交错误报告吗?


不支持转换 SRF 函数(在 FROM 子句中) - 您不能在那里使用任何运算符。只允许函数调用。

只能在列列表中进行强制转换:

postgres=# SELECT * FROM unnest('{2,NULL,1}'::int[])::text;
ERROR:  syntax error at or near "::"
LINE 1: SELECT * FROM unnest('{2,NULL,1}'::int[])::text;
                                                 ^
postgres=# SELECT v::text FROM unnest('{2,NULL,1}'::int[]) g(v);
   v    
────────
      2
 [null]
      1
(3 rows)

NULL 中缺少行可能是错误,应该报告

postgres=# SELECT unnest('{1,NULL,4}'::int[])::text;
 unnest 
────────
      1
 [null]
      4
(3 rows)

postgres=# SELECT unnest('{1,NULL,4}'::int[])::numeric;
 unnest 
────────
      1
      4
(2 rows)

我认为没有理由应该删除 NULL 行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转换 unnest() 结果时 NULL emements 丢失 的相关文章

  • 如何将字节数组转换为图像 [kotlin]

    我想将字节数组转换为图像并在图像视图中显示它 但不知道该怎么做 有人可以指导我吗 我使用这个函数将位图转换为字节数组 private fun BitmapToByteArray ByteArray val stream ByteArrayO
  • 如何在 JavaScript 中构建一个计算数组中出现次数的对象?

    我想计算数组中某个数字出现的频率 例如 在Python中我可以使用Collections Counter创建一个字典 记录某个项目在列表中出现的频率 据我所知 JavaScript 是这样的 var array 1 4 4 5 5 7 va
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • 为什么 Eclipse 有时会对 JavaScript 中的数组数组发出警告?

    在 Eclipse 中 以下 JavaScript 行 var a1 1 2 3 4 生成警告 Type mismatch cannot convert from Number to any Type mismatch cannot con
  • 操作错误:游标“_django_curs_”不存在

    我们有一个由 django postgresql 和 heroku 提供支持的在线商店 Web 应用程序 对于特定的活动 您可以将活动视为要购买的产品 我们已成功售出 10 000 份以上的副本 然而 根据我们的 Sentry 报告 我们的
  • 当名称是数组时如何使用 Javascript 修改 HTML Select

    我有两个同名的 html select 对象 它们是具有不同索引的数组 我想做的是 如果从类别 0 选择元素中选择 关闭 我想禁用类别 1 元素 我一直在尝试使用 document getElementsByName 但无法弄清楚如何专门针
  • 数组初始化编译时间 - Constexpr 序列

    我正在读书this https stackoverflow com questions 45938798 for loop with variable step size c 45939130关于SO的问题 这个问题本身并不是那么有趣 但我
  • 将tensorflow 2.0 BatchDataset转换为numpy数组

    我有这个代码 train images test images tf keras datasets mnist load data train dataset tf data Dataset from tensor slices train
  • 即使将“enable_seqscan”设置为关闭后,也未使用数组列上的 GIN 索引?

    根据推荐this https stackoverflow com questions 4058731 can postgresql index array columns comment10357041 4059785评论 我建立了一个 i
  • 如何在数据库中存储年月?

    是否有在数据库中存储年份和月份的标准方法 我需要根据月份和年份制作一些报告 我无法使用日期和函数实时提取月份 因为表很大 所以我需要预处理 我会和 Michael 的建议是什么 https stackoverflow com a 81694
  • 使用 OpenCV 描述符与 findFundamentalMat 匹配

    我之前发布了有关同一程序的问题 但没有收到答案 我已经纠正了当时遇到的问题 但又面临新的问题 基本上 我使用未校准的方法自动校正立体图像对的旋转和平移 我使用 SURF 等特征检测算法来查找两个图像 左右立体图像对 中的点 然后再次使用 S
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co
  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • C# 3维数组

    我想将 3 维数组中的 ARRAY 存储到buildingCostIds 中 但它说我必须有第三个数字 public static int buildingCost 0 1 2 5 5 5 public static void addBui
  • Java:如何读取一个 int 的多个扫描仪值

    我一直在试图弄清楚如何根据从获得的输入来计算面积和体积Scanner班级 该练习包括一次接收多对半径和高度 我已经编写了这些方法并对其进行了测试 所以这些方法应该有效 我遇到的问题是当我想使用 扫描仪 的输入并使用它们进行计算时 这是我的代
  • 如何进行 PostgreSQL 交叉表查询,列中缺少值

    我正在尝试使用 PostgreSQL 9 5 交叉表查询创建周转时间报告 其中推荐分为第 1 2 3 4 gt 4 天 请参见下面的输出 但是 如果我运行查询并且第 2 天的值丢失 则我的查询可以正常工作 整行将向左移动一个单元格 所以第二
  • 如何将文件中的行读入数组?

    我正在尝试将文件作为行数组读入 然后使用 zsh 对其进行迭代 我得到的代码在大多数情况下都有效 除非输入文件包含某些字符 例如括号 这是它的一个片段 bin zsh LIST cat path to some file txt SIZE
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • 如何在 Jupyter Notebook 中将“Completer.use_jedi”永久配置为“False”

    每次有新的Jupyter笔记本实例打开后 需要 config Completer use jedi False在自动完成功能开始工作之前运行命令 每次都要配置 好累use jedi to False在编码之前 请建议是否有永久修复以在 ju
  • having 子句出错

    select SUM Bill from ProductSaleReport group by PCI having MONTH Date between 1 and 3 请问有谁可以吗 帮我找到问题 我收到错误 消息 8121 16 级
  • PerformanceCounterCategory.GetCategories() 抛出异常 ArgumentException - 参数“categoryName”的值“无效”

    当我尝试运行此代码时 var categories System Diagnostics PerformanceCounterCategory GetCategories 我收到 ArgumentException 异常 我已经尝试过以下方
  • 如何首先使用实体​​框架5模型生成每个层次结构的表

    我首先使用 Visual Studio 2012 和实体框架 5 模型 我想使用每个层次结构一个表策略生成数据库 但找不到该选项 Entity Designer Database Generation Power Pack 不适用于 Vis
  • 将输入转换为大写的 Uppercase 属性

    我正在 MVC4 中工作 想要使用Uppercase属性 这个想法是 Uppercase 属性的存在将导致模型值在到达服务器时转换为大写 目前我的模型中有以下代码 Required Display Name Account Code Str
  • 拖/放时可以使用鼠标滚轮吗?

    在 WinForms 中 调用DoDragDrop要开始拖动项目 控件不再使用鼠标滚轮滚动 并且控件的MouseWheel事件不再被调用 直到用户放下他正在拖动的任何东西 有没有办法让鼠标滚轮在拖动时工作 你可以获得全球MouseWheel
  • 如何部署 Angular 应用程序?

    一旦 Angular 应用程序进入生产阶段 如何部署它们 到目前为止我见过的所有指南 甚至在角 io 依靠 lite server 提供服务并通过 browserSync 来反映更改 但是当您完成开发后 如何发布应用程序 我是否导入所有编译
  • 如何在运行时向用户请求提升权限?

    某些以普通用户启动的应用程序会在必要时请求提升权限 例如文件管理器需要写入此类文件夹 然后继续操作 我怎样才能复制这种行为 正如 Tam s 指出的那样 您需要启动一个具有更高权利的新流程 我过去进行了很多搜索 但没有找到任何方法来提升当前
  • ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

    在 ASP Net Core 2 0 中 我尝试返回带有状态代码的 json 或 xml 格式的消息 我从控制器返回自定义消息没有问题 但我不知道如何在中间件中处理它 到目前为止 我的中间件类看起来像这样 public class Head
  • .net 随机生成器是如何实现的?

    我的意思是 net c 中的标准 随机生成器 Random random new Random seed random next 我知道文献中有数十或数百种方法 但我无法找出 net框架目前使用的是哪一种 提问的原因 如果我抽取很多随机变量
  • 当类路径没有设置为jdk路径时,java编译器如何找到类文件?

    我正在尝试深入了解 java 编译 所以我收起 IDE 并开始使用 MS DOS 命令行 我创建了一个简单的项目 如下面的树中所述 示例应用程序 src pack Sample java classes 这是 Sample java 源代码
  • 如何默认选择单选按钮 - asp.net mvc 强类型 html 帮助程序

    我有一个像这样的单选按钮列表 我希望默认选择此按钮 我该怎么做呢 或者在呈现此视图的控制器操作中 model Gender Male return View model
  • HBase 扫描性能

    我正在执行范围扫描 这给了我 500k 记录 如果我设置scan setCaching 100000 花费了不到一秒钟的时间 但是如果scan setCaching 100000 未设置花了近 38 秒 如果我设置scan setBlock
  • Android VideoView无法播放视频mp4

    我使用 Android VideoView 通过 HTTP 播放视频文件 我的问题是我的手机提示 无法播放视频 抱歉 该视频无法播放 从 HTTP 播放 mp4 文件时 但是播放其他mp4视频文件就可以了 当在较新的手机 如三星 Galax
  • 抑制 Roslyn 代码分析器的问题

    有什么方法可以抑制 Roslyn 分析仪的问题吗 我使用即时分析器项目类型 如果用户想要的话 我想抑制这些问题 而且它必须是永久的 如果我重新打开 Visual Studio 仍必须应用相同的抑制规则 您可以采用与忽略普通 C 编译器警告完
  • 如何在 OpenGL (ES) 中正确渲染重合多边形

    据我了解 通过在 OpenGL ES 中设置深度函数 可以控制重叠几何图形在 3D 场景中的渲染方式 我用gl depthFunc gl LEQUAL webgl 在我的代码中 然而 当两组多边形重合且颜色不同时 生成的表面将是两种颜色的任
  • 利用sandybridge的硬件真随机数生成器?

    我想知道是否有办法利用英特尔 Sandy Bridge CPU 中基于新硬件的真数生成器 我读到英特尔的 MKL 数学内核库 公开了此功能 但这需要 MKL 套件和英特尔编译器 最终非常昂贵 是否有另一种方法可以在我的 C 代码中使用硬件随
  • 如何使用 JaXB 获取验证事件?

    我尝试使用 Jaxb 获取变量中的验证消息 尝试这里的例子http docs oracle com cd E17802 01 webservices webservices docs 1 6 api javax xml bind Unmar
  • 我是谁?如何使用 Microsoft Office 权限/用户权限

    Microsoft Office 文档 我的情况是 PowerPoint 演示文稿 可以具有受限的权限 如何以编程方式找出我的代码对给定文档拥有哪些权限 我在 MSDN 上能找到关于这个主题的所有内容是 http msdn microsof
  • 转换 unnest() 结果时 NULL emements 丢失

    我偶然发现了非常奇怪的行为unnest 在扩展数组后进行转换时 介绍 使用 unnest 可以使用三种基本语法变体 1 SELECT unnest 1 NULL 4 int AS i 2 SELECT i FROM unnest 2 NUL