sql - PostgreSQL 数组装饰器

标签 sql arrays postgresql

我意识到在 PostgreSQL 的表中有两种指示数组的方法,但我无法弄清楚它们之间的区别是什么,或者是否有任何一种有任何优势。

好像有两种语法:

  • {a,b,c,d,e}
  • [0:4]={a,b,c,d,e}

例如:

CREATE TABLE table1
     (id serial, arrayspalte smallint[], dt timestamp)
;

INSERT INTO table1
     (id, arrayspalte, dt)
VALUES
     (330, '[0:4]={12,14,27,45,50}', '2007-09-30 10:39:52'),
     (331, '{2, 6,100,200,500,1000}', '2007-09-30 10:41:52')

;

表格中的内容如下所示: enter image description here

都是一个数组,但是两者看起来很不一样。很明显,前者显示的是数组的维度,但两者之间有什么更大的区别吗?将两种类型放在同一张表中是否可以,否则会导致问题吗?

最佳答案

默认情况下数组下界为1:

select ('{12,14,27,45,50}'::int[])[5];
 int4 
------
   50

您将下限更改为零:

select ('[0:4]={12,14,27,45,50}'::int[])[5];
 int4 
------

(1 row)

在您的示例中,不能在 [0] 处返回第二个数组的第一个元素

select
    coalesce(a[0]::text, 'null'),
    array_lower(a, 1),
    array_upper(a, 1)
from (values
    ('[0:4]={12,14,27,45,50}'::int[]),
    ('{2, 6,100,200,500,1000}')
) s(a)
;
 coalesce | array_lower | array_upper 
----------+-------------+-------------
 12       |           0 |           4
 null     |           1 |           6

关于sql - PostgreSQL 数组装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33127980/

相关文章:

sql - 更新语句导致Oracle "No more data to read from socket"?

c - 在C中对文件中的 float 进行排序

java - 为什么数组的元素必须在方法内定义?

arrays - Perl 检查数组中是否存在以单词开头的行,并将匹配的值返回给变量

python - sqlalchemy过滤查询中的子项,但不过滤父项

database - Docker Swarm 如何处理数据库(PostgreSQL)复制?

postgreSQL pg_dump 通过局域网

c# - 获取插入项的ID

MySQL 检索每个不同 ID 的最大行数

mysql - SQL 返回 2 个值重复的所有行