从PostgreSQL中选择当前表名。

3

我有一个查询,由多个子查询组成,这些子查询通过 UNION ALL 合并。

SELECT pan_hash, amount FROM humo_txns

UNION ALL

SELECT pan_hash, amount FROM uzcard_txns

LIMIT 10;

但是在检索到我需要的数据之后,我需要某种方式找出数据源,因此我认为将数据来自的表名作为新列也包含在内可能是一个不错的主意。那么有没有办法实现这样的功能呢?
SELECT <table_name>, pan_hash, amount FROM humo_txns

UNION ALL

SELECT <table_name>, pan_hash, amount FROM uzcard_txns

LIMIT 10;
4个回答

9

您不需要硬编码表名。您可以使用特殊的内置系统列tableoid来标识一行记录所属的表。由于tableoid是一个数字,您需要将它转换为regclass类型才能查看实际名称:

SELECT tableoid::regclass AS table_name, pan_hash, amount 
FROM humo_txns
UNION ALL
SELECT tableoid::regclass, pan_hash, amount 
FROM uzcard_txns
LIMIT 10;

我觉得那就是我正在寻找的东西。稍后我会检查一下。 - Dils Matchanov
无法工作,使用 SELECT tableoid::regclass AS table_name, ... 我得到的错误消息是:在表 "custom_field_sections" 中有一个名为 "tableoid" 的列,但它不能从查询的这一部分引用。 - Alter Lagos

2

是的,只需选择文本字面量并为其使用某些列别名:

SELECT 'humo_txns' AS table_name, pan_hash, amount FROM humo_txns
UNION ALL
SELECT 'uzcard_txns' AS table_name, pan_hash, amount FROM uzcard_txns
LIMIT 10;

这将从表中的所有行中随机选择十行,与您的查询一样。因此,您可能会得到来自两个表的行或仅来自一个表的行。

1
您可以尝试以下内容 -
SELECT 'humo_txns', pan_hash, amount FROM humo_txns
UNION ALL
SELECT 'uzcard_txns', pan_hash, amount FROM uzcard_txns
LIMIT 10;

你通过这种方式包装购买什么? - shawnt00
@shawnt00,没事:) 我认为这个限制应该适用于两个select语句。 - Fahmi

1

没有内置的函数可以做到这一点,您需要在每个选择框中手动输入名称。

SELECT CAST('humo_txns' AS VARCHAR(64)) AS table_name, pan_hash, amount FROM humo_txns

UNION ALL

SELECT CAST('uzcard_txns' AS VARCHAR(64)) AS table_name, pan_hash, amount FROM uzcard_txns

我建议在第一个查询中至少将其转换为足够长以容纳任何表名的varchar字段。


强制转换是不必要的,字符串常量会自动具有“text”类型。但如果您确实想要进行强制转换,“varchar(64)”就足够用于表名。 - user330315
@a_horse_with_no_name 谢谢您提供的额外信息,我对Postgres不是很熟悉,在某些关系型数据库中,数据类型是通过对第一个查询结果进行采样来确定的,这可能会导致意外的行为,因此建议更改大小为64,就像您建议的那样。 - Pred
确实有一个函数可以做到这一点(大多数情况下在Postgres中都是如此),正如@a_horse_with_no_name的回答所述=>tableoid::regclass 因此,这个回答的第一句话是错误的说法。 - luba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接