我有一个PostgreSQL函数(或表),它给我以下输出:
Sl.no username Designation salary etc..
1 A XYZ 10000 ...
2 B RTS 50000 ...
3 C QWE 20000 ...
4 D HGD 34343 ...
Run Code Online (Sandbox Code Playgroud)
现在我想要输出如下:
Sl.no 1 2 3 4 ...
Username A B C D ...
Designation XYZ RTS QWE HGD ...
Salary 10000 50000 20000 34343 ...
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
Ι有一些表(例如[Table1],[Table2],[Table3]等)与[ID]作为主键和一个RecTime作为DATETIME每个.
ΑlsoΙ有一个表[Files],用于保存varbinary(max)列中的文件,并引用具有其名称和ID的其他表.
[Table2],[Table3]和其他人有不同的结构,但完全分享[ID]和[RecTime]列[Table1]
以下是可视化数据的快速示例.
DECLARE @Table1 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table2 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table3 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Files as table (
[ID] [bigint]
, [tblName] nvarchar(255) NULL
, [tblID] bigint NULL
, [BinaryData] varbinary(max)
/* …Run Code Online (Sandbox Code Playgroud) 可能重复:
Postgres动态查询功能
我希望使用下面查询中返回的字符串作为其他查询的表名.
SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')
Run Code Online (Sandbox Code Playgroud)
如你所见,它返回一个字符串.我希望将它用作另一个查询的输入,例如
CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd'))
AS * SELECT FROM backup
Run Code Online (Sandbox Code Playgroud)
可以吗?有什么线索怎么样?
我试图使用动态SQL在postgres中运行一些查询.
例:
EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)))
Run Code Online (Sandbox Code Playgroud)
我必须查询一个表,其格式为result_%s_table,其中,我需要用另一个表替换正确的表名(一个id).
我收到了错误 ERROR: prepared statement "format" does not exist
是否可以通过脚本/工具基于表fk关系生成删除语句.
即我有表:DelMe(ID)并且有30个表格,其中我需要首先删除其ID的fk引用,是否有一些我可以运行的工具/脚本将生成基于FK关系的30个删除语句为了我 ?
(顺便说一下我知道关于级联删除的关系,我不能在这个现有的db中使用它)
我正在使用Microsoft SQL Server 2008
我试图crosstab在PostgreSQL中创建查询,以便它自动生成crosstab列而不是硬编码.我编写了一个函数,可以动态生成我的crosstab查询所需的列列表.我们的想法是crosstab使用动态sql 在查询中替换此函数的结果.
我知道如何在SQL Server中轻松完成这项工作,但我对PostgreSQL的了解有限,阻碍了我在这方面的进展.我正在考虑将生成动态列列表的函数结果存储到变量中,并使用它来动态构建sql查询.如果有人可以指导我这样做会很棒.
-- Table which has be pivoted
CREATE TABLE test_db
(
kernel_id int,
key int,
value int
);
INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);
-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
key_id int;
text_op TEXT = '' kernel_id int, '';
BEGIN
FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP …Run Code Online (Sandbox Code Playgroud) 看起来像使用动态SQL通过EXECUTE字符串方法创建的#temptables具有不同的范围,并且不能被同一存储过程中的"固定"SQL引用.但是,我可以在子序列动态SQL中引用由动态SQL语句创建的临时表,但似乎存储过程不会将查询结果返回给调用客户端,除非修复了SQL.
一个简单的2表场景:我有2个表.我们称之为订单和物品.Order具有OrderId的主键,而Items具有ItemId的主键.Items.OrderId是标识父订单的外键.订单可以包含1到n个项目.
我希望能够为用户提供一个非常灵活的"查询构建器"类型界面,以允许用户选择他想要查看的项目.过滤条件可以基于Items表和/或父Order表中的字段.如果一个项满足过滤条件包括和父条件中的条件(如果存在),那么该项应该在查询中返回以及父订单.
通常,我想,大多数人会在Item表和父Order表之间构造一个连接.我想改为执行2个单独的查询.一个返回所有符合条件的项目,另一个返回所有不同的父订单.原因有两个,你可能会也可能不会同意.
第一个原因是我需要查询父Order表中的所有列,如果我执行单个查询将Orders表连接到Items表,我将多次重新发布Order信息.由于每个订单通常有大量商品,我想避免这种情况,因为这会导致更多的数据被转移到胖客户端.相反,如上所述,我想在数据集中单独返回两个表,并使用其中的两个表来填充自定义Order和子Items客户端对象.(我对LINQ或Entity Framework还不够了解.我手工构建了我的对象).
我希望做的是这样的:
在客户端上构造一个动态SQL字符串,它将orders表连接到Items表,并根据在Winform胖客户端应用程序上创建的自定义过滤器指定的每个表上的过滤器.客户端上的SQL构建看起来像这样:
TempSQL = "
INSERT INTO #ItemsToQuery
OrderId, ItemsId
FROM
Orders, Items
WHERE
Orders.OrderID = Items.OrderId AND
/* Some unpredictable Order filters go here */
AND
/* Some unpredictable Items filters go here */
"
Run Code Online (Sandbox Code Playgroud)
然后,我会调用一个存储过程,
CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
Execute (@tempSQL) --to create the #ItemsToQuery table
SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)
SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,#ItemsToQuery表由于它是由动态SQL创建的,因此无法从以下2个静态SQL中访问,如果我将静态SQL更改为动态,则不会将结果传递回胖客户端.
我想到了一个更好的一个: …
即席查询与存储过程对比动态SQL.任何人都可以说利弊吗?
使用PostgreSQL,第一条记录的表中的列值存储在记录变量中.例如:让变量为:recordvar
recordvar.columnname
Run Code Online (Sandbox Code Playgroud)
给出指定列名的值.我将columname在变量中定义:
var := columnname
Run Code Online (Sandbox Code Playgroud)
在地方columnname,如果我与变量如更换recordvar.var,这是行不通的.
请让我知道如何处理这种情况.以下是示例代码:
CREATE OR REPLACE FUNCTION getrowdata(id numeric, table_name character varying)
RETURNS SETOF void AS
$BODY$
DECLARE
srowdata record;
reqfield character varying;
value numeric;
BEGIN
RAISE NOTICE 'id: %',id;
reqfield:= 'columnname';
EXECUTE 'select * from datas.'||table_name||' WHERE id = '||id into srowdata;
RAISE NOTICE 'srowdata: %',srowdata;
RAISE NOTICE 'srowdatadata.columnname: %',srowdata.columnname;
value:= srowdata.reqfield;
RAISE NOTICE 'value: %',value;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中,我想创建一个安全包装机制,如果发生异常,它将返回空结果.考虑以下:
SELECT * FROM myschema.mytable;
Run Code Online (Sandbox Code Playgroud)
我可以在客户端应用程序中进行安全包装:
try {
result = execute_query('SELECT value FROM myschema.mytable').fetchall();
}
catch(pg_exception) {
result = []
}
Run Code Online (Sandbox Code Playgroud)
但我可以直接在SQL中做这样的事情吗?我想使下面的代码工作,但似乎它应该被放入DO $$ ... $$块中,在这里我迷路了.
BEGIN
SELECT * FROM myschema.mytable;
EXCEPTION WHEN others THEN
SELECT unnest(ARRAY[]::TEXT[])
END
Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
postgresql ×6
sql ×6
plpgsql ×3
crosstab ×2
sql-server ×2
cursors ×1
foreign-keys ×1
hstore ×1
pivot-table ×1
psql ×1
t-sql ×1
temp-tables ×1
types ×1