相关疑难解决方法(0)

从PostgreSQL函数返回SETOF行

我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在PostgreSQL中我加入时.我收到错误"需要列定义列表".

有什么方法可以绕过这个,我不想提供返回列的定义.

CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
  RETURNS SETOF ???? AS
$BODY$
Declare 
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
   Begin
   SqlString  := 'select * from view1 left join ' + databaseobject  + ' as view2 on view1.id = view2.id';
   End;
ELSE
    Begin
    SqlString := 'select * from view3 left join ' + databaseobject  + ' as view2 on view3.id = view2.id';
    End;
END IF; 
execute …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-9.2

11
推荐指数
1
解决办法
3万
查看次数

如何仅在不存在的情况下创建记录,避免重复并且不会引发任何错误?

众所周知,Model.find_or_create_by(X)实际上:

  1. 由X选择
  2. 如果找不到 - >由X创建
  3. 返回记录(找到或创建)

在步骤1和2之间可能存在争用条件.为了避免数据库中的X重复,应该在X的字段集上使用唯一索引.但是如果应用唯一索引,那么竞争事务之一将失败异常(尝试创建X的副本时).

如何实现"安全版本",#find_or_create_by它永远不会引发任何异常并始终按预期工作?

postgresql transactions ruby-on-rails upsert rails-activerecord

8
推荐指数
1
解决办法
5834
查看次数

使用不同参数测试函数中的null

我有一个Postgres功能:

create function myfunction(integer, text, text, text, text, text, text) RETURNS 
table(id int, match text, score int, nr int, nr_extra character varying, info character varying, postcode character varying,
street character varying, place character varying, country character varying, the_geom geometry)
AS $$
BEGIN

return query (select a.id, 'address' as match, 1 as score, a.ad_nr, a.ad_nr_extra,a.ad_info,a.ad_postcode, s.name as street, p.name place , c.name country, a.wkb_geometry as wkb_geometry from "Addresses" a 
    left join "Streets" s on a.street_id = s.id 
        left join "Places" p …
Run Code Online (Sandbox Code Playgroud)

postgresql null dynamic-sql plpgsql postgresql-9.1

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

如何将记录传递给PL/pgSQL函数?

我有8个类似的PL/pgSQL函数; 它们被用作INSTEAD OF INSERT/UPDATE/DELETE视图的触发器以使它们可写.每个视图组合了一个通用表的列(在下面的示例中称为"事物")和一个特殊表(下面的"shaped_things"和"flavored_things").顺便说一句,PostgreSQL的继承功能在我们的案例中不能使用.

触发器必须在通用表中插入/更新行; 这些部分在所有8个功能中是相同的.由于泛型表有大约30列,我试图在那里使用辅助函数,但是我无法将视图的NEW记录传递给需要things记录作为输入的函数.

(这里这里都提出类似的问题,但我不认为我可以在我的案例中应用建议的解决方案.)

简化的架构

CREATE TABLE things (
    id    SERIAL  PRIMARY KEY,
    name  TEXT    NOT NULL
    -- (plus 30 more columns)
);
CREATE TABLE flavored_things (
    thing_id  INT   PRIMARY KEY REFERENCES things (id) ON DELETE CASCADE,
    flavor    TEXT  NOT NULL
);
CREATE TABLE shaped_things (
    thing_id  INT   PRIMARY KEY REFERENCES things (id) ON DELETE CASCADE,
    shape     TEXT  NOT NULL
);
-- etc...
Run Code Online (Sandbox Code Playgroud)

flavored_things的可写视图实现

CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql parameters triggers function plpgsql

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

执行动态交叉表查询

我在Postgres数据库中实现了这个功能:http://www.cureffi.org/2013/03/19/automatically-creating-pivot-table-column-names-in-postgresql/

这是功能:

create or replace function xtab (tablename varchar, rowc varchar, colc varchar, cellc varchar, celldatatype varchar) returns varchar language plpgsql as $$
declare
    dynsql1 varchar;
    dynsql2 varchar;
    columnlist varchar;
begin
    -- 1. retrieve list of column names.
    dynsql1 = 'select string_agg(distinct '||colc||'||'' '||celldatatype||''','','' order by '||colc||'||'' '||celldatatype||''') from '||tablename||';';
    execute dynsql1 into columnlist;
    -- 2. set up the crosstab query
    dynsql2 = 'select * from crosstab (
 ''select '||rowc||','||colc||','||cellc||' from '||tablename||' group by 1,2 order by …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql crosstab plpgsql

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

如何从函数返回表的行类型和附加列?

我有一个像这样定义的表:

create table users (
  id serial primary key,
  name text,
  email text,
);
Run Code Online (Sandbox Code Playgroud)

...我想编写一个返回形状行的函数:

(
  id integer,
  name text,
  email text,
  some_other_column boolean,
)
Run Code Online (Sandbox Code Playgroud)

我设法使用下面的代码使其工作,但我宁愿不重新定义用户表中的列:

create or replace function get_users () 
returns table (
  id integer,
  name text,
  email text,
  some_other_column boolean,
) as $$
    select users.*, true as some_other_column from users;
$$ language sql;
Run Code Online (Sandbox Code Playgroud)

有没有办法通过执行这样的操作来动态创建行类型?(postgres 在 处抱怨语法错误users.*):

create or replace function get_users () 
returns table (
  users.*, 
  some_other_column boolean
) as $$
    select users.*, true as …
Run Code Online (Sandbox Code Playgroud)

postgresql return-type plpgsql set-returning-functions

6
推荐指数
1
解决办法
1785
查看次数

SELECT FROM函数返回一个具有arbirary列数的记录

我正在使用PostgreSQL数据库.

我有一个我的plpgsql FUNCTION,返回一个record具有任意数量列的单个.
由于这种任意性,我需要使用类似的东西:

SELECT * FROM my_function(97)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为Postgres给了我以下错误:

返回"记录"的函数需要列定义列表

但如果我这样做:

SELECT my_function(97)
Run Code Online (Sandbox Code Playgroud)

我可以看到预期的结果,但封装在一个列中.

有没有办法将预期结果作为函数预期的一组列获取,而不是一个封装所有列的列?

postgresql types stored-procedures record plpgsql

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

如何在每列上执行相同的聚合,而不列出列?

我有一个N列的表.让我们给他们打电话c1,c2,c3,c4,... cN.在多行中,我希望COUNT DISTINCT(cX)在[1,N]中为每个X 获得一行.

c1 | c2 | ... | cn
0  | 4  | ... | 1
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以这样做(在存储过程中),而无需手动将每个列名写入查询?

为什么?

我们遇到了一个问题,即应用程序服务器中的错误意味着我们会在以后插入垃圾时重写好的列值.为了解决这个问题,我正在存储信息日志结构,其中每一行代表一个逻辑UPDATE查询.然后,当给出记录完成的信号时,我可以确定是否(错误地)覆盖了任何值.

多行中单个正确记录的示例:每列最多有一个值.

| id | initialize_time | start_time | end_time |
| 1  | 12:00am         | NULL       | NULL     |
| 1  | 12:00am         | 1:00pm     | NULL     |
| 1  | 12:00am         | NULL       | 2:00pm   |

Reconciled row:
| 1  | 12:00am         | …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql relational-database

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

Postgres:查找每列的不同值的数量

我试图找到表的每一列中不同值的数量。声明性地是:

for each column of table xyz
run_query("SELECT COUNT(DISTINCT column) FROM xyz")      
Run Code Online (Sandbox Code Playgroud)

此处显示查找表的列名。

SELECT column_name 
FROM information_schema.columns
WHERE table_name=xyz
Run Code Online (Sandbox Code Playgroud)

但是,我无法在内部合并计数查询。我尝试了各种查询,这个:

SELECT column_name, thecount
FROM information_schema.columns, 
   (SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

语法上不允许(不允许在嵌套查询中引用 column_name)。

这似乎也是错误的(超时):

SELECT column_name, count(distinct column_name) 
FROM information_schema.columns, myTable
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

使用一个查询获取表的每一列的不同值数量的正确方法是什么?

文章SQL 查找列中不同值的数量仅讨论固定列。

postgresql dynamic-sql

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

以编程方式构建SQL查询的强大方法

我不得不求助于ORM不足的原始SQL(使用Django 1.7).问题是大多数查询最终都有80-90%的相似性.在不违反可重用性的情况下,我无法找到构建查询的强大而安全的方法.

字符串连接是唯一的出路,即使用if-else条件构建无参数查询字符串,然后使用预准备语句安全地包含参数(以避免SQL注入).我想按照一种简单的方法来为我的项目模板化SQL,而不是重新发明一个迷你ORM.

例如,考虑以下查询:

SELECT id, name, team, rank_score
FROM
  ( SELECT id, name, team
    ROW_NUMBER() OVER (PARTITION BY team
                       ORDER BY count_score DESC) AS rank_score
    FROM 
      (SELECT id, name, team
       COUNT(score) AS count_score
       FROM people
       INNER JOIN scores on (scores.people_id = people.id)
       GROUP BY id, name, team
      ) AS count_table
  ) AS rank_table
WHERE rank_score < 3
Run Code Online (Sandbox Code Playgroud)

我怎么能够:

a)添加可选WHERE约束people
b)更改INNER JOINLEFT OUTER
c)更改COUNTSUM
d)完全跳过该OVER …

sql postgresql orm dynamic-sql plpgsql

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