我正在PL/pgSQL中开发一些存储过程,其中一些给我一些问题.我正在开发的sprocs通过参数接收一个数组,我在FOR LOOP中使用它来获取它的所有元素.要定义FOR LOOP的上限,我使用array_length函数.
FOR i IN 1..array_length(array,1) LOOP
--array[i] something in here
END LOOP;
Run Code Online (Sandbox Code Playgroud)
当我向sprocs提供一个空数组时会出现问题.sproc只是返回一个错误,而不是不进入循环,说明FOR LOOP的上限是NULL.不应该是0吗?
我对FOR LOOP有什么不妥吗?
有没有其他方法在LOOP中使用相同的边界而不使用空数组时返回NULL?
注意:我知道我总是可以在LOOP之前使用条件,如下所示:
IF array_length(array,1) IS NOT NULL THEN
Run Code Online (Sandbox Code Playgroud)
但问题是:这个sproc应该在最短的时间内处理数千个电话.因此,我并不期待为处理增加不必要的开销.我只是在寻找是否有办法在循环中"循环"一个空数组.
我在PostgreSQL中有两个相同长度的数组值:
{a,b,c} 和 {d,e,f}
我想把它们结合起来
{{a,d},{b,e},{c,f}}
有没有办法做到这一点?
我的应用程序有一个Events带有时间戳事件的表.
我需要在每个最近的N时间间隔内报告事件的数量.对于不同的报告,间隔可以是"每周"或"每天"或"每小时"或"每15分钟间隔".
例如,用户可以显示他们每周,每天,每小时或每季度收到的订单数量.
1)我的偏好是动态地执行单个SQL查询(我正在使用Postgres)按任意时间间隔进行分组.有没有办法做到这一点?
2)一种简单但丑陋的暴力方法是对按时间戳排序的开始/结束时间帧内的所有记录执行单个查询,然后使用方法按任意间隔手动构建计数.
3)另一种方法是在事件表中为每个区间添加单独的字段并静态存储一个the_week the_day,the_hour和the_quarter_hour字段,这样我就可以在创建记录时(一次)进行"点击",而不是每次报告该字段时.
这里有什么最好的做法,因为我可以根据需要修改模型和预先存储间隔数据(尽管只需要将表格宽度加倍);
sql postgresql ruby-on-rails aggregate-functions generate-series
CREATE TABLE subscription (
magazine_id bigint,
user_id bigint,
PRIMARY KEY (magazine_id, user_id)
);
CREATE TABLE delivery (
magazine_id bigint,
user_id bigint,
FOREIGN KEY (subscription) REFERENCES subscription (magazine_id, user_id)
);
Run Code Online (Sandbox Code Playgroud)
在给定特定订阅的情况下查询交付的好方法是什么?有没有办法为列名PRIMARY KEY (magazine_id, user_id)和相应的外键分配列名,以便我可以像这样查询
SELECT *
FROM subscription
JOIN delivery ON (delivery.subscription_fk = delivery.subscription_pk);
Run Code Online (Sandbox Code Playgroud)
注意:我可以写这样的东西:
SELECT *
FROM subscription
JOIN delivery ON (delivery.magazine_id = subscription.magazine_id
AND delivery.user_id = subscription.user_id);
Run Code Online (Sandbox Code Playgroud)
但是,我的印象是,实现这一目标的方式不那么冗长.
我有SELECT:
SELECT c FROM (
SELECT "candidate_id" as id, count("candidate_id") as c
FROM "Applicaions"
GROUP BY "candidate_id"
) as s WHERE id= _SOME_ID_;
Run Code Online (Sandbox Code Playgroud)
但是这只会返回一个值count > 0.如果count = 0它什么也没有返回 如何获得0没有任何申请的"候选人"?
有表"候选人".
如果候选人没有申请或不存在,我需要获得0.
我现在有了:
SELECT COALESCE ((SELECT count("candidate_id") as c
FROM "Applicaions" WHERE "candidate_id"=_SOME_ID_
GROUP BY "candidate_id"), 0);
Run Code Online (Sandbox Code Playgroud)
它完美地运作.但是有可能把它写得更简单或者这是最好的解决方案吗?我应该创建任何索引吗?
我正在使用SQL transact命令将Unix脚本转换为PostgreSQL命令.
我有一个包含字段last_update_time(xtime)的记录的表,我想选择表中已在选定时间段内更新的每个记录.
比如,当前时间05/01/2012 10:00:00和所选时间是04/01/2012 23:55:00.如何从表中选择在这些日期之间更新的所有记录.在发出psql命令之前,我已在Unix脚本中将2次转换为秒,并计算了2个时间段之间的间隔(以秒为单位).
我觉得有点像
SELECT A,B,C FROM table
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now();
Run Code Online (Sandbox Code Playgroud)
我无法评价Parm的selectedtimeParm-它不妥善解决.
编者按:我没有改变不正确的使用条款period,time frame,time并date为DateTime类型timestamp,因为我讨论,在我的答案.
我有一个带有列month(integer)的表.在本专栏中,我存储的值如下1, 2, .. 12.
但我必须显示月份名称.
例如:如果值是1我需要显示jan.
我正在尝试使用PostgreSQL 9.1.3学习SQL.我想了解一些让我觉得不一致的行为.以机智:
这有效:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
Run Code Online (Sandbox Code Playgroud)
我明白了:
?column?
----------
2
3
Run Code Online (Sandbox Code Playgroud)
这有效:
WITH outmost AS (
(WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Run Code Online (Sandbox Code Playgroud)
结果:
?column?
----------
2
Run Code Online (Sandbox Code Playgroud)
这也有效:
WITH outmost AS (
SELECT 1
UNION (WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Run Code Online (Sandbox Code Playgroud)
我明白了:
?column?
----------
1
2
Run Code Online (Sandbox Code Playgroud)
但是,这并不能正常工作:
WITH outmost AS (
SELECT 1
UNION …Run Code Online (Sandbox Code Playgroud) 我在谷歌或文档中找到答案时遇到问题......
我需要针对数组类型做一个不区分大小写的选择.
因此,如果:
value = {"Foo","bar","bAz"}
Run Code Online (Sandbox Code Playgroud)
我需要
SELECT value FROM table WHERE 'foo' = ANY(value)
Run Code Online (Sandbox Code Playgroud)
匹配.
我尝试了很多lower()的组合而没有成功.
ILIKE而不是=似乎工作,但我一直很紧张LIKE- 这是最好的方式吗?
在PostgreSQL中,是否可以生成一系列重复数字?例如,我想生成数字1到10,每个数字重复3次:
1
1
1
2
2
2
3
3
3
.. and so on.
Run Code Online (Sandbox Code Playgroud)