Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSql中基于枚举类型获取枚举(使用条件语句)_Sql_Postgresql_Enums - Fatal编程技术网

如何在PostgreSql中基于枚举类型获取枚举(使用条件语句)

如何在PostgreSql中基于枚举类型获取枚举(使用条件语句),sql,postgresql,enums,Sql,Postgresql,Enums,我正在Postgresql中使用enum。我在数据库中使用了一个名为city的枚举。我的要求是如何使用条件语句获取枚举。 我使用了这个查询 SELECT 'Bengaluru'::CITY as TEXT 它工作正常,但如果在枚举中找不到文本,则会抛出错误。我应该如何进行/更改sql查询,使其不会抛出错误 SELECT CASE WHEN 'Bengaluru'::CITY !=NULL THEN 'Bengaluru'::CITY ELSE "Not Found" EN

我正在Postgresql中使用enum。我在数据库中使用了一个名为city的枚举。我的要求是如何使用条件语句获取枚举。 我使用了这个查询

SELECT 'Bengaluru'::CITY as TEXT 
它工作正常,但如果在枚举中找不到文本,则会抛出错误。我应该如何进行/更改sql查询,使其不会抛出错误

SELECT 
    CASE WHEN 'Bengaluru'::CITY !=NULL THEN 'Bengaluru'::CITY ELSE "Not Found" 
    END as TEXT
案例
可在此处使用


有关语法的更多详细信息,请查看系统表。 假设枚举定义为:

create type city as enum ('Munich', 'Berlin'); 
要了解是否为枚举类型定义了特定标签,可以使用以下命令:

select exists (select *
                from pg_enum e
                  join pg_type t on t.oid = e.enumtypid
                  join pg_namespace s on s.oid = t.typnamespace
                where s.nspname = 'public' --<< adjust here for the correct schema
                  and t.typname = 'city'
                  and e.enumlabel = 'Bengaluru');
要检查是否存在城市名称,只需使用:

select id
from city
where name = 'Bengaluru';

枚举是一种设计反模式。请使用适当的查找表。然后,您可以轻松地运行一条语句,检查是否存在不会导致错误的值查找表是什么意思?如何创建它@一个没有名字的马是一个标准的一对多关系:一个单独的
城市
表格,例如
创建表格城市(id整数主键,名称文本不为空)
。然后使用一个外键来引用city表。我以前使用过相同的外键,但我们不希望city位于单独的表中。我们正计划为此使用Enum@没有名字的马你知道枚举违反了规范化吗?您知道Enum施加的限制吗?如何知道?如果值不存在,则它将返回字符串“notfound”,而不是error。您不这么认为吗?不,强制转换“Bengaluru”::CITY将导致“enum CITY的输入值无效:“Bengaluru”。另外:您不能使用
=(或
)要与空常量和字符串常量进行比较,需要用单引号括起来
“未找到”
指的是一列。它给出了错误信息。错误:在“THEN”第1行或其附近出现语法错误:选择“Bengaluru”::CITY不为空,然后选择“Bengaluru”::CITY@iamrajshah仍然收到错误,请检查一次带有\u no \u名称的@a_horse\u查询
create table some_table_using_city
(
   ... other columns ...
   city_id integer references city
);
select id
from city
where name = 'Bengaluru';