我需要检索表中的所有行,其中2列组合都是不同的.因此,我希望所有在同一天没有任何其他销售的销售以相同的价格出售.基于日期和价格的唯一销售将更新为活动状态.
所以我在想:
UPDATE sales
SET status = 'ACTIVE'
WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
FROM sales
HAVING count = 1)
Run Code Online (Sandbox Code Playgroud)
但是我的大脑比那更远了.
我有两张桌子:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
Run Code Online (Sandbox Code Playgroud)
A将永远是其子集B(意味着所有列A也在其中B).
我想更新具有特定ID输入的记录,其中B包含来自A所有列的数据A.这ID存在于A和B.
是否有UPDATE语法或任何其他方法来指定列名称,只是说"设置A的所有列"?
我正在使用PostgreSQL,因此也接受了一个特定的非标准命令(但不是首选).
我想在Postgres函数中传递一个表名作为参数.我试过这段代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer
AS $$
BEGIN
IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
return 1;
END IF;
return 0;
END;
$$ LANGUAGE plpgsql;
select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
ERROR: syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
^
********** Error **********
ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)
以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:
ERROR: column tab.id does not exist
LINE 1: ...T EXISTS …Run Code Online (Sandbox Code Playgroud) 我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.
CREATE OR REPLACE FUNCTION data_of(integer)
RETURNS text AS
$BODY$
DECLARE
sensors varchar(100); -- holds list of column names
type varchar(100); -- holds name of table
result text; -- holds SQL query
-- declare more variables
BEGIN
-- do some crazy stuff
result := 'SELECT\r\nDatahora,' || sensors ||
'\r\n\r\nFROM\r\n' || type ||
'\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
sensors …
首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html
所以我的问题:
我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量.我正在使用Ado.Net提供商.
在Oracle中,解决方案将包含4个步骤:
我怎么能用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助可以迁移到devard.
我正在尝试创建一个函数,该函数将采用通用表并将 N 列转换为大写。我没有找到此类问题的解决方案,但我能够提出以下建议:
create or replace function uc_on_insert()
returns trigger as
$$
declare
p_tbl varchar = TG_TABLE_NAME;
p_sch varchar = TG_TABLE_SCHEMA;
i varchar;
begin
for i in
(select column_name
from INFORMATION_SCHEMA.COLUMNS
where 1=1
and table_name ilike p_tbl
and table_schema ilike p_sch
and data_type ='character varying')
loop
execute 'new.' || i || ' = upper(new.' || i || ');';
return new;
end loop;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
我目前收到此错误:
ERROR: syntax error at or near "new"
LINE 1: new.c1 = upper(new.c1);
^ …Run Code Online (Sandbox Code Playgroud) 我想使用带有表和几列的 plpgsql 函数作为输入参数。这个想法是将表格分成块,并对每个部分做一些事情。
我尝试了以下功能:
CREATE OR REPLACE FUNCTION my_func(Integer)
RETURNS SETOF my_part
AS $$
DECLARE
out my_part;
BEGIN
FOR i IN 0..$1 LOOP
FOR out IN
SELECT * FROM my_func2(SELECT * FROM table1 WHERE id = i)
LOOP
RETURN NEXT out;
END LOOP;
END LOOP;
RETURN;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
my_func2() 是在每个较小的部分上做一些工作的函数。
CREATE or REPLACE FUNCTION my_func2(table1)
RETURNS SETOF my_part2 AS
$$
BEGIN
RETURN QUERY
SELECT * FROM table1;
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
如果我运行:
SELECT * FROM my_func(99);
Run Code Online (Sandbox Code Playgroud)
我想我应该收到为每个 ID …
postgresql ×7
dynamic-sql ×5
plpgsql ×5
sql ×4
sql-update ×2
database ×1
distinct ×1
duplicates ×1
function ×1
identifier ×1
triggers ×1
types ×1