【问题标题】:Compare arrays of different lengths in Postgresql在 Postgresql 中比较不同长度的数组
【发布时间】:2017-05-05 21:37:20
【问题描述】:

我正在使用 Postgresql 来存储 Ruby gem 版本号。我想根据用户提供的自定义谓词和基本版本过滤这些版本,为此我将两个版本都转换为整数数组(以便于比较):4.2.0 变为 '{4,2,0}'

这很好用:

'{4,0,0}' < '{4,1,0}' # yields TRUE

不过,当数组长度不同时,我会遇到问题:

'{4}' < '{5,0,0}' # yields TRUE
'{4,1,2}' < '{4,1}' # also yields TRUE when it should be FALSE

我在文档中找不到与此特定问题相关的任何内容。我怎样才能实现我所追求的?如果元素较少的数组可以正确填充零(这将导致我的预期行为),那就太好了。

【问题讨论】:

  • 不确定“数组”是什么意思,但select '{4,1,2}'::int[] &lt; '{4,1}'::int[]; 产生FALSE...
  • 天哪,我肯定累了。感谢您指出了这一点!您可以为其添加答案。
  • 让我们认为这只是一个错字:o) 祝你好运。

标签: arrays postgresql comparison


【解决方案1】:

一种方法是标准化所有版本的数组长度,这样当您进行数组转换时'{4,1}''{4,1,0}'

您可以使用array_length(array,dimension)(在这种情况下dimension为1)检查转换后每个数组中的元素数,然后追加 使用array_append(array, element)(在这种情况下,element 为 0)一个或两个零,具体取决于返回值。

那么当你进行比较时:
'{4,0,0}' < '{5,0,0}' # will still yield TRUE '{4,1,2}' < '{4,1,0}' # will now correctly yield FALSE

编辑:如下所述,这仅是原始数组的每个元素由单个数字整数或数字字符组成的情况。由于正在比较整个字符串,如果字符串的数字元素长度超过一个字符,则可能会失败。

【讨论】:

  • 但是select '{40,1,2}' &lt; '{4,1,0}'; 产生TRUE :o)
  • {1,2,3} 实际上与整数没有任何关系,它只是带有一些内容的字符串。显然,OP 和你还在尝试比较两个字符串而不是两个数组......(提示:请参阅我在问题下的评论)
  • 我只考虑原始数组的每个元素由单个数字整数或数字字符组成的情况。由于正在比较整个字符串,如果字符串的数字元素长度超过一个字符,则它可能会失败,正如@Abelisto 所指出的那样。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多