我是 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/