tableoid
- это путь к go, как уже предлагал Адам.
Но это быстрее и безопаснее:
SELECT CASE t.tableoid WHEN 'transportation'::regclass THEN 'Transportation'
WHEN 'locations'::regclass THEN 'Locations'
ELSE 'Unknown' END AS type
FROM some_table t;
Таким образом, мы приводим указанные таблицы к oid один раз - вместо двух приведений для каждой строки. Кроме того, сравнение OID (внутреннее 4-байтовое целое) обходится дешевле, чем text
. Примерно в 10 раз быстрее в быстром тесте на Postgres 12.
Укажите имена таблиц, если возможна неоднозначность:
SELECT CASE t.tableoid WHEN 'public.transportation'::regclass THEN 'Transportation'
WHEN 'public.locations'::regclass THEN 'Locations' ...
В противном случае вы зависите от текущего search_path
из сеанс:
Если вы на самом деле используете смешанные имена, такие как правописание в вопросе предполагает, что вы должны добавить двойные кавычки:
SELECT CASE t.tableoid WHEN 'public."Transportation"'::regclass THEN 'Transportation'
WHEN 'public."Locations"'::regclass THEN 'Locations' ...
См .:
Если указанные таблицы могут не существовать, вы рискуете получить ошибку от приведения. Вы можете предотвратить это, используя to_regclass()
вместо:
SELECT CASE t.tableoid WHEN to_regclass('transportation') THEN 'Transportation'
WHEN to_regclass('locations') THEN 'Locations' ...
Но эта функция дороже, чем обычное приведение. См .:
Ничто из этого не кажется на самом деле необходимым для ваш вариант использования. В любом случае вы должны адаптировать имя таблицы в предложении FROM
, вы можете просто сделать то же самое для выражения в предложении SELECT
.
Однако с наследованием или разбиением это может быть очень важно. См .: