首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL:如何查询具有自定义范围的列?

PostgreSQL:如何查询具有自定义范围的列?
EN

Database Administration用户
提问于 2014-07-05 19:10:26
回答 1查看 1.2K关注 0票数 0

我试图在一个名为grades_served的字符串列上编写一个查询,该列的值可以是

代码语言:javascript
运行
复制
k-5
1-5
5-9

查询可以是特定级别的查询,也可以是具有起始值和结束值的范围。

我想看看这件事上最好的办法是什么。直觉告诉我将列重新格式化为范围数据类型,但问题是这是一个复杂的范围,包含字符串值,例如k和Pre。

我考虑过创建一个自定义类型,但这似乎有点过分,而且我以前从未这样做过。

http://www.postgresql.org/docs/9.3/static/sql-createtype.html

会很感激你的任何想法或建议。

EN

回答 1

Database Administration用户

发布于 2014-07-07 00:35:55

范围类型将允许最佳性能和简单查询。

如果有些字符串值(如kPre-K )与数值混合,只需创建一个具有秩值的级别表(表示实际排序顺序的整数值):

代码语言:javascript
运行
复制
CREATE TABLE grade(
   grade text PRIMARY KEY
  ,grade_int UNIQUE int NOT NULL
);

您的数字等级可以方便地分配相同的grade_value,其他年级根据其等级获得整数值。

您可以编写一个简单的函数来将带原始字符串值的范围转换为它们的整数表示形式.

反之亦然,以便在需要时显示grades_served列。

grades_served转换为int4range类型。

使用重叠算子&&,您对一系列年级的查询可以简单地是:

代码语言:javascript
运行
复制
SELECT * FROM tbl WHERE grades_served && '[1,4]'::int4range;

或者,对于单个级别,“包含元素”运算符@>

代码语言:javascript
运行
复制
SELECT * FROM tbl WHERE grades_served @> -1;

指数

如果您的表不是很小,我建议您创建一个GiST索引来支持该索引(手册也是如此)。

代码语言:javascript
运行
复制
CREATE INDEX tbl_grades_served_idx ON tbl USING gist (grades_served);
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/69799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档