arrays - PostgreSQL 数组错误

标签 arrays postgresql triggers

我是 PostgreSQL 的新人, 我创建了 2 个表

CREATE TABLE HOUR(
id integer,
hour timestamp ) ;

CREATE TABLE ACTIVITY_TIME(
id integer,
day_hours varchar[][] ) ;

day_hours列是 array组合的周数和 ID 为 HOUR表。该列的值看起来像 {{1,5},{2,5},{2,6}} .当我删除 hour 时,我尝试创建一个触发器来自 HOURS表,在 ACTIVITY_TIME 中我必须在那个小时存在的 day_hours 中删除。例如,如果我删除 id=6来自 HOUR day_hours 的结果将是 {{1,5},{2,5}} ,或者如果 day_hours {{3,2},{3,4},{4,2}}如果我删除 id=2来自 HOUR day_hours 的结果将是 {{3,4}} .我知道如何写触发器,但我不会写 procedure这是执行数组

WITH summary AS (
    SELECT
        "unnest" (
            "DAY_HOURS" [ 1 : array_length("DAY_HOURS",1)][ 1 : 1 ]:: INT []
        ) AS days,
        "unnest" (
            "DAY_HOURS" [ 1 : array_length("DAY_HOURS",1)][ 2 : 2 ]:: INT []
        ) AS hours
    FROM
        "ACTIVITY_TIME"
    WHERE
        "ID" = 3
) 

SELECT ARRAY(SELECT ARRAY[ s.days,s.hours] FROM
    summary s WHERE s.hours!= 2 )

这给error :could not find array type for data type integer[]错误,

最佳答案

问题是函数 array()(我的意思是函数 array() 而不是构造函数 ARRAY[])确实不接受数组作为参数。这个查询:

SELECT array(select array[1,2]);

给你报错:

ERROR:  could not find array type for data type integer[]

array() 函数接受一个集合作为参数。使用函数 unnest 转换集合中的数组:

SELECT array(select unnest(array[1,2]));

-- Result:
--   array 
--  -------
--   {1,2}

然而,这会在一维数组中取消嵌套二维数组的所有元素。作为解决方法,您可以先将数组转换为文本,构建文本数组,再次转换为文本,删除引号,最后将文本结果转换为二维数组: 你的查询看起来像这样:

WITH summary AS (
    SELECT
        unnest (
            DAY_HOURS [ 1 : array_length(DAY_HOURS,1)][ 1 : 1 ]:: INT []
        ) AS days,
        unnest (
            DAY_HOURS [ 1 : array_length(DAY_HOURS,1)][ 2 : 2 ]:: INT []
        ) AS hours
    FROM
        ACTIVITY_TIME
    WHERE
        ID = 3
) 
select replace(array(SELECT  ARRAY[ s.days,s.hours]::text FROM  -- <<< change this line
    summary s WHERE s.hours!= 2 )::text, '"','')::int[][] AS array; -- <<< change this line

返回:

        array        
---------------------
 {{1,5},{2,5},{2,6}}
(1 row)

关于arrays - PostgreSQL 数组错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32867267/

相关文章:

c# - 我可以通过 C++/CLI 包装器将 C# 数组传递给 C 指针吗?

postgresql - 在 Pentaho 中创建仪表板时在 postgres 中创建“太多连接”

postgresql - Postgres 删除 jsonb 字段中的反斜杠

arrays - pg 删除数组中的公共(public)部分

mysql - 在 mysql 触发器中使用 NEW 选择

arrays - PowerShell 中的并集和交集?

javascript - 不使用 eval 创建未知大小的对象

mysql - MySql 中的 TRIGGER 代替 CHECK 子句

python - 分配给多维数组

mysql - 我是否需要使用一个命令在 MySQL 触发器中开始结束?