我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在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) 众所周知,Model.find_or_create_by(X)实际上:
在步骤1和2之间可能存在争用条件.为了避免数据库中的X重复,应该在X的字段集上使用唯一索引.但是如果应用唯一索引,那么竞争事务之一将失败异常(尝试创建X的副本时).
如何实现"安全版本",#find_or_create_by它永远不会引发任何异常并始终按预期工作?
postgresql transactions ruby-on-rails upsert rails-activerecord
我有一个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) 我有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)
CREATE …Run Code Online (Sandbox Code Playgroud) 我在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) 我有一个像这样定义的表:
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数据库.
我有一个我的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)
我可以看到预期的结果,但封装在一个列中.
有没有办法将预期结果作为函数预期的一组列获取,而不是一个封装所有列的列?
我有一个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) 我试图找到表的每一列中不同值的数量。声明性地是:
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 查找列中不同值的数量仅讨论固定列。
我不得不求助于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 JOIN为LEFT OUTER 或
c)更改COUNT为SUM 或
d)完全跳过该OVER …
postgresql ×10
plpgsql ×7
dynamic-sql ×5
sql ×2
crosstab ×1
database ×1
function ×1
null ×1
orm ×1
parameters ×1
record ×1
return-type ×1
transactions ×1
triggers ×1
types ×1
upsert ×1