【问题标题】:Select columns that are primary key or foreign key only选择仅作为主键或外键的列
【发布时间】:2020-10-15 18:46:45
【问题描述】:

假设我有下表

CREATE TABLE my_table (
    a  TEXT NULL,
    id TEXT PRIMARY KEY NOT NULL,
    c  TEXT NULL,
    d  TEXT REFERENCES other_table_1(id) NOT NULL,
    e  TEXT REFERENCES other_table_2(id) NOT NULL
);

我想执行一个只选择主键和外键的重要列的选择语句。

 SELECT (...?) FROM my_table 

仅预期输出列id, d, e

我可以实现这一目标的最佳非 hacky 方式是什么?

【问题讨论】:

  • 您是否正在寻找某种自动方式来生成这样的语句?最好的非hacky方法是简单地写select id, d, e from my_table
  • 是的,这将在存储过程中使用。

标签: postgresql


【解决方案1】:

您可以创建一个函数来为您构建 sql 语句,然后执行结果。

CREATE OR REPLACE FUNCTION build_select(_tbl regclass)
  RETURNS text AS
$func$
    SELECT format('SELECT %s FROM %s'
                 , string_agg(quote_ident(important_column), ', ')
                 , $1)
FROM (SELECT a.attname as important_column
FROM   pg_index i
JOIN   pg_attribute a ON a.attrelid = i.indrelid
                     AND a.attnum = ANY(i.indkey)
WHERE  i.indrelid = $1
AND    i.indisprimary
UNION
SELECT  ta.attname AS important_column
  FROM (
   SELECT conname, conrelid, confrelid,
          unnest(conkey) AS conkey, unnest(confkey) AS confkey
     FROM pg_constraint
     WHERE conrelid = $1
  ) sub
  JOIN pg_attribute AS ta ON ta.attrelid = conrelid AND ta.attnum = conkey
  JOIN pg_attribute AS fa ON fa.attrelid = confrelid AND fa.attnum = confkey) my_sub_query
$func$ LANGUAGE sql;

使用此功能,如果您这样做:

SELECT build_select('my-schema.my-table')

会还给你:

SELECT id, d, e FROM my-schema.my-table

你可以执行这个

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2016-05-26
    相关资源
    最近更新 更多