如何从 tarantool 中选择有限数量的记录,就像 SQL 中的 SELECT LIMIT 一样?

2024-06-26

我想在 Tarantool 空间上执行选择,使用过滤和限制结果,就像我可以使用简单的 SQL 查询一样 ”SELECT * FROM users WHERE age > 33 LIMIT 1”。 我怎样才能做到这一点?


可以使用 Lua 和 SQL 来完成。

1)这是 Lua 中的一个例子。假设我们有一个名为“users”的空间,其中包含“name”、“surname”、“age”字段。首先,让我们创建并填充空间:

$ tarantool
Tarantool 2.1.1-465-gbd1a43fbc
type 'help' for interactive help
tarantool> box.cfg({})
...
2019-06-10 14:51:33.827 [47393] main/102/interactive I> ready to accept requests
...
2019-06-10 14:51:33.827 [47393] main/104/checkpoint_daemon I> scheduled next checkpoint for Mon Jun 10 16:14:44 2019
---
...

tarantool> s = box.schema.space.create('users', {temporary=true})
---
...

tarantool> box.space.users:format({{'id','unsigned'},{'name','string'},{'surname','string'},{'age','unsigned'}})
---
...

tarantool> s:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
---
- unique: true
  parts:
  - type: unsigned
    is_nullable: false
    fieldno: 1
  id: 0
  space_id: 512
  name: primary
  type: TREE
...

tarantool> s:insert({1,'Pasha','Yudin',33})
---
- [1, 'Pasha', 'Yudin', 33]
...

tarantool> s:insert({3,'Kostya','Nazarov',34})
---
- [2, 'Kostya', 'Nazarov', 34]
...

tarantool> s:insert({2,'Oleg','Babin',23})
---
- [3, 'Oleg', 'Babin', 23]
...

tarantool> s:insert({4,'Roma','Babaev',34})
---
- [4, 'Roma', 'Babaev', 34]
...

让我们从空间中选择所有记录:

tarantool> s:select()
---
- - [1, 'Pasha', 'Yudin', 33]
  - [2, 'Kostya', 'Nazarov', 23]
  - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

接下来,我们选择所有 33 岁以上的用户。这LuaFun https://luafun.github.io/可以使用库:

tarantool> fun = require('fun')
---
...

tarantool> fun.iter(s:select()):filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

但正如@AlexanderTurenko 下面提到的,最好使用pairs用于不将额外元组加载到内存中的迭代器:

tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
  - [4, 'Roma', 'Babaev', 34]
...

此外,这个变体更短且更具可读性。

最后,我们只选择一个符合我们条件的用户,这相当于SQL查询“SELECT * FROM users WHERE age > 33 LIMIT 1":

tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):take_n(1):totable()
---
- - [3, 'Oleg', 'Babin', 34]
...

2)从Tarantool 2.0开始,可以做到使用SQL https://www.tarantool.io/en/doc/2.1/tutorials/sql_tutorial/(前提是你有空格格式):

box.execute('select * from users where age > 33 limit 1;')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 tarantool 中选择有限数量的记录,就像 SQL 中的 SELECT LIMIT 一样? 的相关文章

  • 对时间序列数据重新采样

    我有一个以毫秒为单位的时间序列列表 我想对时间序列进行重新采样并对组应用平均值 我如何在 Postgres 中实现它 重新采样 是指聚合一秒或一分钟内的所有时间戳 一秒或一分钟内的所有行形成一组 表结构 date x y z Use dat
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0
  • 左连接 SQL 求和

    我有两张桌子想要加入 比如说表 a 和表 b 表 b 有许多行指向表 a 表 b 包含价格 实际上是一个购物篮 所以我想要的是表a中的所有记录和表b中的价格之和 我努力了 select a sum b ach sell from booki
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 选择仅属于特定部门的用户

    我有下表 其中包含两个字段 即 a 和 b 如下所示 create table employe empID varchar 10 department varchar 10 插入一些记录 insert into employe values
  • bigQuery ANY_VALUE 不确定?

    bigQuery ANY VALUE 是确定性的吗 我有一个查询 生成约 200 000 行结果 但如果我在查询后过滤掉重复的条目 它们会减少到约 500 行 为了解决查询本身的问题 我添加了一个 GROUP BY 然后用 ANY VALU
  • 合并和替换函数

    我试图用 替换查询中的所有空值 因为我们的接口不接受 NULL 作为条目 我遇到了一段代码 其中我使用 REPLACE 函数删除 SSN 中的 DASHES 我如何告诉系统为 SSN 列中的 NULL 值提供 并且仍然对非空条目 SSN 执
  • ORACLE 更新并返回 OLD 和 NEW 值

    PL SQL Oracle 12c 中是否有与此 T SQL 查询等效的内容 UPDATE A SET A columnA 10 WHERE A columnB lt 30 OUTPUT INSERTED DELETED 查询更新表A 同时
  • MySQL 将所有空格替换为 -

    我怎样才能删除一行中的所有空格 我在这里看到很多相同的问题 但所有答案都使用替换选项 替换只能去除一个空格 而不是全部 例如 a b c 变为 a b c Thanks 这可以通过以下 MySQL 函数来实现 SELECT REPLACE
  • SQL 用逗号替换点

    我有以下代码 SELECT cast Listenpreis 1 19 as decimal 29 2 as Listenpreis FROM SL M03KNE dbo ARKALK 我得到这个值 5 59 我尝试将点替换为 komma
  • 编写 MySQL 查询以获得所需结果

    我正在使用 MySQL 数据库 风险因素有四种类型 严重 高 中 低 表包含如下数据 id uaid attribute value time risk factor 1 1234 Edge Exist 16123 NONE 2 1234
  • 在 CodeIgniter、SQL 中调用布尔值的成员函数 result()

    我试图根据搜索关键字查看 data results 中有哪些数据 但每次都会出现上述致命错误 有人可以帮助我吗 我的控制器 public function execute search search term this gt input g
  • Sql查询增加多个项目的项目价值价格

    我想编写 Sql 查询来按百分比增加商品价格 场景是 在表中 我有 3 列 ID 商品名称 价格 Example If item Name is T shirt Increase price by 10 item Name is Jins
  • 具有多个表的 SQL select 语句

    给出以下两个表 Person table id pk first middle last age Address table id pk person id fk person id street city state zip 如何创建返回
  • 如何加载大量字符串与oracle数据库匹配?

    我目前正在学习 PL SQL 所以我还是一个新手 假设您有一个生产数据库 并使用 Oracle SQL Developer 连接到该数据库 您对该数据库仅有读取权限 因此您无法创建或编辑任何表 我的问题是 如果我有一个很大的 ID 列表 我
  • 在Django中通过ManyToMany关系添加一个对象

    Django 的 ManyToMany 字段 https docs djangoproject com en dev ref models fields django db models ManyToManyField可以使用填充my fi
  • 使用 C# 检索 SQL Server 中具有 varchar 数据类型的字段的大小

    我正在使用 VS 2010 和 SQL Server 2008 在 ASP NET 中创建一个项目 我想检索具有以下内容的列的大小varchar数据类型 e g Varchar 20 我想要 20 而不是最大可能的大小varchar使用 C
  • 通过sql视图向多个表插入数据

    mysql 有没有办法通过视图向多个表插入数据 MySQL 参考手册对于可更新视图是这样说的 一些视图是可更新的 也就是说 您可以在诸如以下的语句中使用它们UPDATE DELETE or INSERT更新基础表的内容 为了使视图可更新 必
  • mysql 中的 SELECT UNION 和 ORDER BY.. 如何?

    我想从单个表中获取所有行 但以不同的方式对它们进行排序 例如我写 SELECT FROM table1 ORDER BY fieldA ASC LIMIT 3 UNION SELECT FROM table1 ORDER BY FieldB

随机推荐