【发布时间】:2018-09-21 18:17:12
【问题描述】:
我运行SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = 'hello world' 的目的是让hello world 是来自用户的数据,我会将其展平为全小写。我的数据库中的实际值是“Hello World”,但这个搜索每次都返回空。
如果我使用SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable,它肯定会返回小写字母hello world。不知道我在这里缺少什么。
获取实际值的查询:
SELECT JSON_EXTRACT(metadata, "$.title") FROM mytable 得到我"Hello World"
SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable 让我"hello world"
试图找到正确行的查询
让我有价值
SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "Hello World"
SELECT * FROM mytable WHERE metadata->"$.title" = "Hello World"
SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "%hello world%"
什么也得不到
SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "hello world"
SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") LIKE "%hello world%"
SELECT * FROM ututs WHERE LOWER(metadata->"$.title") = "hello world"
SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "hello"
所以看起来结果是返回值,包括引号。不过,这似乎不是问题,因为我在匹配案例时得到了结果。我也很困惑为什么一开始的% 正在解决我的问题。 " 和 H 之间没有空格。我自己输入了 JSON。
我还通过手动输入将metadata 列直接更新为{"title":"Hello World"}。 MySQL 会在冒号后自动添加一个空格以使其成为{"title": "Hello World"},这很好,但只是在检查任何空格。
【问题讨论】:
-
将第二次查询的
hello world结果复制并粘贴到第一次的where子句中,并使用模糊的like代替=。也许你的空白字符不一样? -
你确定
SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable只返回hello world,没有其他字符吗?如果hello world只是返回值的一部分,那么您可能需要使用LIKE '%hello world%'。在您的问题中发布您的确切 JSON 字符串,以便我们更好地帮助您。 -
试试JSON_UNQUOTE() 或->>。
-
根据您的 cmets 更新问题!