首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL虚拟列和通配符

MySQL虚拟列和通配符
EN

Stack Overflow用户
提问于 2020-12-13 23:51:33
回答 1查看 132关注 0票数 2

我正在尝试MySQL二级索引,引用MySQL文档,然后发生了奇怪的事情。

  • 首先,我根据文档中的示例创建了一个带有小修改的表。
代码语言:javascript
运行
复制
create table jemp(
c JSON,
g VARCHAR(20) GENERATED ALWAYS AS (c->"$.name"),
INDEX i (g)
)
  • 其次,我在文档中插入了每个示例的值。
代码语言:javascript
运行
复制
INSERT INTO jemp (c) VALUES
('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),
('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');
  • 然后,我试图用“喜欢”和“通配符”来执行模糊搜索。这不起作用,因为索引不支持前缀%,但是它可以得到结果。
代码语言:javascript
运行
复制
select c->"$.name" as name from jemp where g like "%F%"
  • 奇怪的是,我去掉了前缀%,索引也起作用了。然而,我没有得到任何结果。根据我对MySQL的拙劣理解,这应该是可行的。
代码语言:javascript
运行
复制
select c->"$.name" as name from jemp where g like "F%"

如果有人能帮我的话,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 00:03:52

要使查询正常工作,您需要一个生成的列,该列将名称提取为文本而不是JSON。也就是说,使用->>而不是->

代码语言:javascript
运行
复制
g VARCHAR(20) GENERATED ALWAYS AS (c ->> '$.name')

然后:指数可能对以下两种情况都有帮助:

代码语言:javascript
运行
复制
where g like 'F%'
where g = 'F'

MySQL是否决定使用它则是另一回事;基本上,数据库评估使用索引是否比全面扫描更快。如果它认为该条件将在大量行上匹配,则可能会选择完全扫描。

请注意,对于字符串文本,我始终使用单引号;尽管MySQL不允许使用单引号,但这是SQL标准所指定的。在其他一些数据库中,双引号代表标识符(这也符合标准)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65281967

复制
相关文章

相似问题

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