Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 9.0和9.1之间枚举类型文本排序的差异_Sql_Postgresql_Postgresql 9.1_Jooq_Postgresql 9.0 - Fatal编程技术网

PostgreSQL 9.0和9.1之间枚举类型文本排序的差异

PostgreSQL 9.0和9.1之间枚举类型文本排序的差异,sql,postgresql,postgresql-9.1,jooq,postgresql-9.0,Sql,Postgresql,Postgresql 9.1,Jooq,Postgresql 9.0,PostgreSQL 9.0和9.1之间enum类型的工作方式有一些奇怪的更新。pg_catalog.pg_enum表在PostgreSQL 9.1中有一个新列enumsorder。此顺序似乎覆盖了以前基于OID的枚举顺序 特定枚举类型的OID保证按类型应排序的方式排序,但不保证无关枚举类型的OID的排序 pg_enum行的OID遵循一条特殊规则:偶数OID的排序方式与其枚举类型的排序方式相同。也就是说,如果两个偶数OID属于相同的枚举类型,则较小的OID必须具有较小的enumsortorder

PostgreSQL 9.0和9.1之间
enum
类型的工作方式有一些奇怪的更新。pg_catalog.pg_enum表在PostgreSQL 9.1中有一个新列
enumsorder
。此顺序似乎覆盖了以前基于OID的枚举顺序

特定枚举类型的OID保证按类型应排序的方式排序,但不保证无关枚举类型的OID的排序

pg_enum行的OID遵循一条特殊规则:偶数OID的排序方式与其枚举类型的排序方式相同。也就是说,如果两个偶数OID属于相同的枚举类型,则较小的OID必须具有较小的enumsortorder值。奇数编号的OID值不需要与排序顺序有任何关系。此规则允许枚举比较例程在许多常见情况下避免目录查找。创建和更改枚举类型的例程尝试尽可能将偶数OID分配给枚举值

创建枚举类型时,将为其成员分配排序顺序位置1..n。但稍后添加的成员可能会被赋予enumsortorder的负值或分数。对这些值的唯一要求是它们在每个枚举类型中的顺序正确且唯一

我的问题 对于,我正在阅读
pg_catalog.pg_enum
表,按照OID对枚举文本进行排序,这是PostgreSQL 9.0中指定的方式。对于udpated规范,我似乎应该按照
enumsortorder
对文本进行排序,这似乎表现出不同的行为,因为它涉及“中间”的enum文本插入


pg_目录
读取这些枚举文字最可靠、跨版本兼容的方法是什么?

我认为您需要检查PostgreSQL版本并适当更改行为,或者使用不接触目录的SQL来确定顺序

对于后者,考虑到虚拟枚举:

CREATE TYPE test_enum AS ENUM ('z','x','y');
ALTER TYPE test_enum ADD VALUE 'a' BEFORE 'x';
是使用8.4及更新版本中提供的
行编号
窗口功能,按顺序将枚举标签转换为枚举类型的值:

SELECT enumlabel, row_number() OVER (ORDER BY enumlabel::test_enum) AS sort_key
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype;
这将获取按排序键排序的标签。在较早的Pg版本中,Pg将只按枚举值的
oid
排序,在较新的版本中,它将使用enumsortorder,但您不必在意任何一种方式,您只需告诉PostgreSQL“请按正确的顺序排序”

或者,如果您只需要按照服务器期望的顺序使用它们,请编写:

SELECT enumlabel
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype
ORDER BY enumlabel::test_enum

按标签排序是一种选择,但可能不是DDL作者想要的。我怀疑没有办法保持9.0和9.1之间的顺序“如DDL中定义的那样”兼容?@LukasEder你没有注意到演员阵容。它不是按标签排序,而是通过将标签强制转换到枚举来按枚举排序。编辑使其更加明显。太棒了!(虽然有点奇怪)。没错,我错过了演员阵容的重点。感谢未来的读者:值得一提的是,这种特殊的强制转换语法在PostgreSQL 8.3或其他PostgreSQL 8.x版本中不起作用。@LukasEder它不仅仅是语法;这是因为8.4之前的版本不支持窗口功能。因为8.4之前的版本也已经过时,不受支持,所以我并不担心。尽管如此,措辞还是有所调整。