小编Erw*_*ter的帖子

PL/pgSQL检查是否存在行

我正在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)

sql postgresql exists plpgsql postgresql-9.1

42
推荐指数
2
解决办法
8万
查看次数

GiST和GIN指数之间的差异

我正在实现一个具有数据类型为的列的表,tsvector我试图了解哪个索引更适合使用?

GIN还是GiST?

通过这里查看postgres文档,我似乎得到了:

  • GiST更新和构建索引的速度更快,而且比杜松子酒更准确.

  • GIN更新和构建索引的速度较慢,但​​更准确.

好的,那么为什么有人想要杜松子酒的gist索引字段呢?如果要点可能会给你错误的结果?必须有一些优势(外部表现).

当我想要使用GIN和GiST时,有人可以用外行的方式解释吗?

postgresql indexing full-text-search

42
推荐指数
1
解决办法
2万
查看次数

在pgAdmin中看不到用户定义的数据库"类型"

是否有一种图形方式来在PgAdmin中创建/操作/查看特殊数据库类型?

例如,在PostgreSQL中我们有:

CREATE TYPE compfoo AS (f1 int, f2 text);

我注意到pgAdmin几乎以图形方式显示所有内容,例如触发器,视图,函数,当然还有表格,但我找不到我创建的类型.

postgresql pgadmin

41
推荐指数
1
解决办法
9759
查看次数

将varchar字符串排序为数字

是否可以通过Postgres 8.3中的varchar列强制对结果行进行排序integer

postgresql indexing types integer casting

41
推荐指数
2
解决办法
3万
查看次数

在pgAdmin中创建ER图

从pgAdmin构建基本实体关系图的步骤是什么?

是否有一些插件可以在pgAdmin中执行此操作?

注意:我在网上搜索,但除了绊倒了一个令人筋疲力尽的软件列表(其中大多数不是免费软件或过时的软件)之外我在这里找不到任何线索.

注意2:我的请求没有缩小到pgAdmin,假设我可以导出我的表.

sql postgresql pgadmin

41
推荐指数
1
解决办法
7万
查看次数

将"WHERE"参数传递给PostgreSQL View?

我通过一系列嵌套子查询对我的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)

参数由上面的百分比符号设置.

sql postgresql stored-procedures view

41
推荐指数
3
解决办法
5万
查看次数

如果更新值为null,请不要更新列

我有这样的查询(在函数中):

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_4param_5NULL,然后只更新前三列,离开旧值column_4column_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)

有没有更好的办法?

sql postgresql null sql-update

41
推荐指数
3
解决办法
2万
查看次数

在PL/pgSQL中迭代整数[]

我试图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作为参数传递给函数.我收到此错误:

ERROR:  syntax error at or near "$1"
LINE 1:   $1
Run Code Online (Sandbox Code Playgroud)

如何正确循环数组?

arrays postgresql loops plpgsql postgresql-8.4

40
推荐指数
1
解决办法
5万
查看次数

获取PostgreSQL查询的执行时间

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)

sql postgresql performance

38
推荐指数
3
解决办法
6万
查看次数

Postgres - 将行转置为列

我有下表,它为每个用户提供了多个电子邮件地址.

在此输入图像描述

我需要将其展平为用户查询的列.根据创建日期向我提供"最新"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)

sql database postgresql transpose crosstab

38
推荐指数
2
解决办法
9万
查看次数