当前位置: 首页 > 知识库问答 >
问题:

在Tarantool中用SQL查询不区分大小写的列

温开畅
2023-03-14

我们知道,通过指定排序选项,字符串Tarantool索引可以不区分大小写:collation=“unicode\u ci”。例如。:

t = box.schema.create_space("test")
t:format({{name = "id", type = "number"}, {name = "col1", type = "string"}})
t:create_index('primary')
t:create_index("col1_idx", {parts = {{field = "col1", type = "string", collation = "unicode_ci"}}})
t:insert{1, "aaa"}
t:insert{2, "bbb"}
t:insert{3, "ccc"}

现在我们可以执行不区分大小写的查询:

tarantool> t.index.col1_idx:select("AAA")
---
- - [1, 'aaa']
...

但是如何使用SQL呢?这不起作用:

tarantool> box.execute("select * from \"test\" where \"col1\" = 'AAA'")
---
- metadata:
  - name: id
    type: number
  - name: col1
    type: string
  rows: []
...

这也不是:

tarantool> box.execute("select * from \"test\" indexed by \"col1_idx\" where \"col1\" = 'AAA'")
---
- metadata:
  - name: id
    type: number
  - name: col1
    type: string
  rows: []
...

有一个肮脏的把戏,性能很差(完全扫描)。我们不想要它,是吗?

tarantool> box.execute("select * from \"test\" indexed by \"col1_idx\" where upper(\"col1\") = 'AAA'")
---
- metadata:
  - name: id
    type: number
  - name: col1
    type: string
  rows:
  - [1, 'aaa']
...

最后,我们还有一个解决办法:

tarantool> box.execute("select * from \"test\" where \"col1\" = 'AAA' collate \"unicode_ci\"")
---
- metadata:
  - name: id
    type: number
  - name: col1
    type: string
  rows:
  - [1, 'aaa']
...

但问题是,它是否使用索引?如果没有索引,它也可以工作。。。

共有1个答案

应和光
2023-03-14

可以检查查询计划以确定是否使用了特定的索引。要获取查询计划,只需将“解释查询计划”前缀添加到原始查询。例如:

tarantool>  box.execute("explain query plan select * from \"test\" where \"col1\" = 'AAA' collate \"unicode_ci\"")
---
- metadata:
  - name: selectid
    type: integer
  - name: order
    type: integer
  - name: from
    type: integer
  - name: detail
    type: text
  rows:
  - [0, 0, 0, 'SEARCH TABLE test USING COVERING INDEX col1_idx (col1=?) (~1 row)']
...

所以答案是“是”,在这种情况下使用索引。
另一个例子是:

box.execute("select * from \"test\" indexed by \"col1_idx\" where \"col1\" = 'AAA'")

不幸的是,这种比较中的排序规则是二进制的,因为索引的排序规则被忽略。在SQL中,比较期间只考虑使用列的排序规则。此限制将在相应问题解决后立即解决。

 类似资料:
  • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut

  • 问题内容: 我有这个json文件: 我使用以下Go代码搜索数据: 它会查找是否通过“板球”之类的相同字符串进行搜索,但是如果我搜索此“板球”之类的字符串,则不会找到它。 问题答案: 添加到您的RegEx。

  • 问题内容: 我正在使用Flask-SQLAlchemy从用户数据库中查询;但是,虽然 will return doing returns 我想知道是否有一种以不区分大小写的方式查询数据库的方法,以便第二个示例仍然返回 问题答案: 你可以使用过滤器中的或功能来完成此操作: 另一种选择是使用而不是进行搜索:

  • 问题内容: 有谁知道如何使用Postgres 7.4进行不区分大小写的搜索/查询? 我在考虑RegEx,但不确定如何执行此操作,或者不确定是否有函数/标志或可以添加查询的内容? 我正在使用PHP连接并执行查询。 因此,我正在寻找匹配地址信息的方法。 例子: 有什么想法吗? 问题答案: 使用,例如: 文件资料。 或者,您可以使用或,例如:

  • 我有一个Spring Data Neo4j(3.4.0.RELEASE)实体,它带有一个

  • 问题内容: 使用Spring CrudRepository查询;我想使用“名称”属性选择“设备类型”实体。但是下面的查询选择区分大小写的权利。我如何使其不区分大小写。谢谢。 问题答案: 就像评论中提到的@Peter一样,只需添加: 请参阅文档,以获取方法名称中所有受支持的关键字的列表。