我在 Postgres 数据库中有一个非常基本的分类列,当前存储为 VARCHAR。我可以选择每个计数:
我虽然添加一个ORDER BY array_position()
会做到这一点:
SELECT color, count(*)
FROM research
GROUP BY color
ORDER BY array_position(ARRAY['Red','Orange','Yellow','Green','Blue'], color);
但我看到一个类型错误:
ERROR: function array_position(text[], character varying) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 98
我需要转换什么color
才能使用该array_position
功能来订购它?
样本数据
你有一张像这样的桌子,
ENUM
类型您有一个枚举的颜色列表。所以这里最简单的事情就是使用ENUM 类型
然后
现在它更快、更高效、更清洁。更多的胜利。更多欢乐。等
ENUM
在内部存储为 4 字节。就是你所需要的。
数组排序
但是,您拥有上帝赋予的权利,可以像对待任何其他不支持 ENUM 类型的数据库一样对待它,
我认为这很好,但我相信这里的实现有一个限制,
本质上是
这意味着您需要(速度无关紧要,因为两个选项执行相同)
制作
color
原生的专栏text
。这可以在调用中完成,或者您可以实际修改表和应该。在 PostgreSQL 中,没有什么是varchar
没有限制的(因为这只是文本的并行类型),很少有东西应该varchar
有限制(因为没有优势)或者,您可以将数组本身构造为类型
varchar[]
补充说明
varchar
forcolors
。即使您坚持不使用ENUM
此处(尽管我愿意),那也应该是text
这
array_position
是一个速记,我希望它比类似的操作要慢得多