我正在PL/pgSQL中编写一个函数,我正在寻找检查行是否存在的最简单方法.
现在我正在选择一个integer进入a boolean,这不起作用.我对PL/pgSQL还没有足够的经验知道最好的方法.
这是我的功能的一部分:
DECLARE person_exists boolean;
BEGIN
person_exists := FALSE;
SELECT "person_id" INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists THEN
-- Do something
END IF;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
更新 - 我现在正在做这样的事情:
DECLARE person_exists integer;
BEGIN
person_exists := 0;
SELECT count("person_id") INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists < 1 THEN
-- Do something
END IF;
Run Code Online (Sandbox Code Playgroud) 我正在实现一个具有数据类型为的列的表,tsvector我试图了解哪个索引更适合使用?
GIN还是GiST?
通过这里查看postgres文档,我似乎得到了:
GiST更新和构建索引的速度更快,而且比杜松子酒更准确.
GIN更新和构建索引的速度较慢,但更准确.
好的,那么为什么有人想要杜松子酒的gist索引字段呢?如果要点可能会给你错误的结果?必须有一些优势(外部表现).
当我想要使用GIN和GiST时,有人可以用外行的方式解释吗?
是否有一种图形方式来在PgAdmin中创建/操作/查看特殊数据库类型?
例如,在PostgreSQL中我们有:
CREATE TYPE compfoo AS (f1 int, f2 text);
我注意到pgAdmin几乎以图形方式显示所有内容,例如触发器,视图,函数,当然还有表格,但我找不到我创建的类型.
是否可以通过Postgres 8.3中的varchar列强制对结果行进行排序integer?
从pgAdmin构建基本实体关系图的步骤是什么?
是否有一些插件可以在pgAdmin中执行此操作?
注意:我在网上搜索,但除了绊倒了一个令人筋疲力尽的软件列表(其中大多数不是免费软件或过时的软件)之外我在这里找不到任何线索.
注意2:我的请求没有缩小到pgAdmin,假设我可以导出我的表.
我通过一系列嵌套子查询对我的PostgreSQL数据库进行了相当复杂的查询,该数据库跨越4个表.然而,尽管外观和设置略显棘手,但最终它将返回两列(来自同一个表,如果这有助于这种情况)基于两个外部参数的匹配(两个字符串需要与不同表中的字段匹配).我对PostgreSQL中的数据库设计还是比较陌生的,所以我知道这个看似神奇的东西叫做Views,这似乎可以帮助我,但也许不是.
有没有什么方法可以在视图中移动我的复杂查询,并以某种方式只传递我需要匹配的两个值?这将大大简化我在前端的代码(通过将复杂性转移到数据库结构).我可以创建一个包装我的静态示例查询的视图,它可以正常工作,但是只适用于一对字符串值.我需要能够使用各种不同的值.
因此我的问题是:是否可以将参数传递给静态视图并使其变为"动态"?或者View可能不是接近它的正确方法.如果还有其他更好的东西,我全都耳朵!
*编辑:*根据评论中的要求,这是我现在的查询:
SELECT param_label, param_graphics_label
FROM parameters
WHERE param_id IN
(SELECT param_id
FROM parameter_links
WHERE region_id =
(SELECT region_id
FROM regions
WHERE region_label = '%PARAMETER 1%' AND model_id =
(SELECT model_id FROM models WHERE model_label = '%PARAMETER 2%')
)
) AND active = 'TRUE'
ORDER BY param_graphics_label;
Run Code Online (Sandbox Code Playgroud)
参数由上面的百分比符号设置.
我有这样的查询(在函数中):
UPDATE some_table SET
column_1 = param_1,
column_2 = param_2,
column_3 = param_3,
column_4 = param_4,
column_5 = param_5
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)
param_x我的函数的参数在哪里.有没有办法不更新那些param的列NULL?例如-如果param_4和param_5是NULL,然后只更新前三列,离开旧值column_4和column_5.
我现在这样做的方式是:
SELECT * INTO temp_row FROM some_table WHERE id = some_id;
UPDATE some_table SET
column_1 = COALESCE(param_1, temp_row.column_1),
column_2 = COALESCE(param_2, temp_row.column_2),
column_3 = COALESCE(param_3, temp_row.column_3),
column_4 = COALESCE(param_4, temp_row.column_4),
column_5 = COALESCE(param_5, temp_row.column_5)
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我试图integer[]在plpgsql函数中循环遍历整数数组().像这样的东西:
declare
a integer[] = array[1,2,3];
i bigint;
begin
for i in a
loop
raise notice "% ",i;
end loop;
return true;
end
Run Code Online (Sandbox Code Playgroud)
在我的实际用例中,整数数组a作为参数传递给函数.我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "$1" LINE 1: $1
如何正确循环数组?
DECLARE @StartTime datetime,@EndTime datetime
SELECT @StartTime=GETDATE()
select distinct born_on.name
from born_on,died_on
where (FLOOR(('2012-01-30'-born_on.DOB)/365.25) <= (
select max(FLOOR((died_on.DOD - born_on.DOB)/365.25))
from died_on, born_on
where (died_on.name=born_on.name))
)
and (born_on.name <> All(select name from died_on))
SELECT @EndTime=GETDATE()
SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in millisecs]
Run Code Online (Sandbox Code Playgroud)
我无法获得查询时间.相反,我收到以下错误:
sql:/home/an/Desktop/dbms/query.sql:9: ERROR: syntax error at or near "@"
LINE 1: DECLARE @StartTime datetime,@EndTime datetime
Run Code Online (Sandbox Code Playgroud) 我有下表,它为每个用户提供了多个电子邮件地址.

我需要将其展平为用户查询的列.根据创建日期向我提供"最新"3个电子邮件地址.
user.name | user.id | email1 | email2 | email3**
Mary | 123 | mary@gmail.com | mary@yahoo.co.uk | mary@test.com
Joe | 345 | joe@gmail.com | [NULL] | [NULL]
Run Code Online (Sandbox Code Playgroud)