Elixir Ecto: 范围数据类型

PostgreSQL 9.2 以来, 可以用特定的操作符和函数存储和查询一个值的范围. 这是一个非常不错的特性, 比如在电子商务应用程序方面, 可以用一个字段 price_range 来替代 min_price, max_price 表示一个价格范围.

在Ecto中使用范围数据类型

价格范围的表示方法如下

[0, 45.67] 
[30.04, 98.50]
[100, 500]

我们可以用范围操作符来查询一个值的范围

2.5 <@ numrange(1.50,7)

Postgresql 支持如下范围类型

  • int4range 整数方位

  • int8range — 大整数范围

  • numrange — 十进制数字范围(浮点)

  • tsrange — 不带时区的时间戳范围

  • tstzrange — 带时区的时间戳范围

  • daterange — 日期范围

Ecto 本身为了兼容各个数据库, 并没有支持Postgresql 特有的Range数据类型, 但Ecto为我们提供了一个自定义数据类型的方法. 下面我们创建一个 NumRange 类型, 底层用了Postgrex适配器的%Postgrex.Range{}结构

defmodule App.NumRange do  @behaviour Ecto.Typedef type, do: :numrangedef cast([lower, upper]) do{:ok, [lower, upper]}enddef cast(_), do: :errordef load(%Postgrex.Range{lower: lower, upper: nil}) do{lower, _} = lower |> to_float{:ok, [lower, nil]}enddef load(%Postgrex.Range{lower: lower, upper: upper}) do{lower, _} = lower |> to_float{upper, _} = upper |> to_float{:ok, [lower, upper]}enddef dump([lower, upper]) do{:ok, %Postgrex.Range{lower: lower, upper: upper, upper_inclusive: false}}enddef dump(_), do: :errordefp to_float(value) dovalue |> Decimal.to_string |> Float.parseend
end 

在模型和迁移脚本中中使用这个自定义数据类型

模型

defmodule App.Product do  use App.Web, :modelschema "products" dofield :price_range, App.NumRangetimestampsend
end  

迁移脚本

defmodule App.Repo.Migrations.Product do  use Ecto.Migrationdef change docreate table(:products) doadd :price_range, :numrangetimestampsendend
end  

范围查询

defmodule App.ProductQuery do  import Ecto.Queryalias App.{Repo, Product}def within_price_range(price) doquery =from p in Product,where: fragment("?::numeric <@ ?", ^price, p.price_range)query |> Repo.allend
end  

关于方位边界的问题, 和数学中的范围符号是一样的:

  • [ 包括下边界

  • ( 不包括下边界

  • ] 包括上边界

  • ) 不包括上边界

例子

# 创建表
create table products(id int, price_range numrange);
# 插入数据
INSERT INTO products VALUES(1, '[10.0, 100.0]')
INSERT INTO products VALUES(1, '[200.0, 300.0]')
INSERT INTO products VALUES(1, '[400.0, 500.0]')
INSERT INTO products VALUES(1, '[600.0, 700.0]')
# 查询
SELECT * FROM products;
+------+--------------------------------------------------------+
|   id | price_range                                            |
|------+--------------------------------------------------------|
|    1 | NumericRange(Decimal('10.0'), Decimal('100.0'), '[]')  |
|    1 | NumericRange(Decimal('200.0'), Decimal('300.0'), '[]') |
|    1 | NumericRange(Decimal('400.0'), Decimal('500.0'), '[]') |
|    1 | NumericRange(Decimal('600.0'), Decimal('700.0'), '[]') |
+------+--------------------------------------------------------+
# 过滤
SELECT * FROM products WHERE price_range::numrange @> 99.0
+------+-------------------------------------------------------+
|   id | price_range                                           |
|------+-------------------------------------------------------|
|    1 | NumericRange(Decimal('10.0'), Decimal('100.0'), '[]') |
+------+-------------------------------------------------------+

参考资料

  • 关于 Postgresql 的范围数据类型, 参考 范围类型

  • Postgresql 范围操作符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们能复活恐龙吗?

全世界只有3.14 % 的人关注了爆炸吧知识鲁迅曾经说过&#xff1a;“不会画漫画的段子手不是好英语老师”咳咳~ 图图君就是这样一位专注知识科普的双语漫画家长按二维码带你去图图君家串串门儿我们到底能不能复活恐龙&#xff1f;长按二维码关注回复“恐龙”寻找答案吧在这里你不…

eks volumn s3_威客电竞 深渊联赛S3欧洲区总决赛,Secret成就八连冠

威客电竞&#xff0c;亚洲领先的专业电竞赛事预测平台。DOTA PIT深渊联赛线上赛第三赛季经过为期一周的激烈比赛&#xff0c;Secret战队在11支参赛队伍中一路杀进总决赛&#xff0c;与VP.P战队展开巅峰对决。最终Secret战队3:0完胜VP.P战队斩获DOTA PIT S3欧洲区冠军&#xff0…

初探IdentityServer4(客户端模式)

Oatuth2协议的客户端模式介绍Client Credentials Grant &#xff08;客户端模式&#xff09;是Oauth2.0协议中&#xff0c;四种模式自建单的一种。它由两部分构成&#xff0c;客户端和认证服务器。认证服务器确认客户端无误后返回一个token&#xff0c;客户端请求带着token访问…

研究表明:胸部大小其实早已.....

1 这样就能不战而胜了&#xff08;素材源于网络&#xff0c;侵删&#xff09;▼2 说好的情比金坚呢&#xff1f;▼3 整挺好&#xff0c;锅都不用洗了&#xff08;via.豆瓣撕破伤口、&#xff09;▼4 就是这么自信▼5 什么丝袜这么厉害▼6 好家伙&#xff0c;请问还需要女婿…

Java学习笔记之 IO包 字节流

IO包最重要的五个类和一个接口 File/OutputStream/InputStream(字节流)/Writer/Reader(字符流) 一个接口&#xff1a;Serializable File类&#xff1a; 字节流&#xff1a; OutputStream与InputStream是抽象类 OutputStream是整个IO包中&#xff0c;字节输出流的最大类 Fi…

bootstrap bootstraptable 固定列_1个Excel公式按条件自定义格式显示固定电话号码

点击右上角“关注”&#xff0c;每天免费获取干货教程前面写了很多篇关于数据查询、数据统计、数据分析、公式排错的教程&#xff0c;今天换一个口味&#xff0c;写个关于自定义格式显示数据的教程。因为工作中很多时候都需要按照指定的要求将数据源整理成固定的格式&#xff0…

记一次引入Elasticsearch的系统架构实战

前言我曾经面试安踏的技术岗&#xff0c;当时面试官问了我一个问题&#xff1a;如果你想使用某个新技术但是领导不愿意&#xff0c;你怎么办&#xff1f;对于该问题我相信大家就算没有面试被问到过&#xff0c;现实工作中同事之间的合作也会遇到。 因此从我的角度重新去回答这…

【 Tomcat 】tomcat8.0 调优配置

2019独角兽企业重金招聘Python工程师标准>>> 1、优化内核及TCP连接&#xff1a; fs.file-max 655350  # 系统文件描述符总量 net.ipv4.ip_local_port_range 1024 65535  # 打开端口范围 net.ipv4.tcp_max_tw_buckets 2000  # 设置tcp连接时TIME_WAIT个数 n…

[转]ORACLE 异常错误处理

本文转自&#xff1a;http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下&#xff1a; 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在…

abb机器人指令手册_第1519课 ABB机器人初级教程

每一位读者都是我分享的动力&#xff0c;感谢大家关注&#xff01;第15课 系统输入输出与IO信号的关联第16课 示教器可编程按钮的使用第17课 什么是程序数据第18课 程序数据的类型与分类第19课 创建程序数据第15课第16课第17课第18课第19课每一位读者都是我分享的动力&#xff…

Java学习笔记之 IO包 字符流

字符流&#xff1a;Writer/Reader(字符流) 通过子类FileWriter和FileReader实现父类实例化 package iotest; import java.io.File; import java.io.Writer; import java.io.Reader; import java.io.FileWriter; import java.io.FileReader; public class OutputStreamDemo2 { p…

ci框架(二)

自定义SQL语句 当提供的API满足不了我们对SQL语句的要求的时候&#xff0c;我们通常是自己来写SQL语句&#xff0c;CI也提供了比较强大了&#xff0c;能够满足我们需求的一般的sql的API。 $res$…

到底该不该使用存储过程

百度百科对存储过程的定义存储过程&#xff08;Stored Procedure&#xff09;是在大型数据库系统中&#xff0c;一组为了完成特定功能的SQL 语句集&#xff0c;它存储在数据库中&#xff0c;一次编译后永久有效&#xff0c;用户通过指定存储过程的名字并给出参数&#xff08;如…

智能卡门禁管理系统_汉中停车场智能门禁系统简介,保安服务收费,行业知识

首页 > 新闻列表 > 正文作者&#xff1a;佚名 点击数&#xff1a; 5更新时间&#xff1a;2020-11-04 08:21:21 导读&#xff1a;名将安防为您提供汉中停车场智能门禁系统简介,保安服务收费的相关知识与详情&#xff1a; 接警时&#xff0c;系统自动调出预警方案&#xf…

推荐系统中协同过滤算法实现分析

原创博客&#xff0c;欢迎转载&#xff0c;转载请注明&#xff1a;http://my.oschina.net/BreathL/blog/62519 最近研究Mahout比较多&#xff0c;特别是里面协同过滤算法&#xff1b;于是把协同过滤算法的这个实现思路与数据流程&#xff0c;总结了一下&#xff0c;以便以后对系…

老黄的2021

0x01 21年怎么说呢&#xff0c;平淡中带点惊喜。21年在现在的公司待满 2 年了&#xff0c;仔细想想&#xff0c;还真是&#xff0c;这是第一个待满 2 年的公司。这一年&#xff0c;有了很多的挑战&#xff0c;业务上的&#xff0c;技术上的&#xff0c;管理上的都是。下半年开始…

document.elementFromPoint

先说一下这个方法的参数 elemntFromPoint(x,y);//传入坐标值&#xff0c;返回当前页面上包含该坐标点的顶层元素 注意2点&#xff0c;坐标值和顶层元素 先说坐标&#xff0c;因为不同的人理解是不一样的&#xff0c;也就造就了这个方法在不同的浏览器中表现是不一样的&#xff…

iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间

导读 王者荣耀神秘关卡暗夜危机怎么进&#xff1f;许多玩家对于这个暗夜危机的关卡还不太熟悉&#xff0c;不知道如何开启&#xff0c;下面就让九游小编为大家带来&#xff0c;王者荣耀暗夜危机开启方法介绍。 王者荣耀神秘关卡暗夜危机怎么进&#xff1f; 峡谷异闻... 王者荣耀…