我有一个奇怪的问题:在表的JSON列中有一个价格,下面的语句给予了不同的结果,但它们应该给出相同的结果:
CAST(COALESCE(JSON_EXTRACT(item.price_details, "$.shipping.price"), 0) AS FLOAT) AS shippricecoalfloat
COALESCE(CAST(JSON_EXTRACT(item.price_details, "$.shipping.price") AS FLOAT), 0) AS shippricefloatcoal
为了检查,我还添加了JSON_EXTRACT(item.price_details, "$.shipping.price") AS shipprice
结果:
MariaDB版本:mariadb Ver 15.1 Distrib 10.3.31-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
个
DB Fiddle (I couldn't use the same MariaDB version but it behaves the same anyways apparently)
2条答案
按热度按时间xmakbtuz1#
您使用了错误的JSON函数。
JSON_EXTRACT()
返回一个在该路径找到的JSON对象,这就是为什么在你的小提琴上仍然会看到双引号。您希望从特定路径返回标量值,因此使用
JSON_VALUE()
另外,数据类型“混乱”的部分原因是JSON将一些值存储为带双引号的字符串,而将一些值存储为数字值。我强烈建议不要在JSON中将数字值用双引号括起来。
https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=d67fa297a5cc4248a06750d71581c022
o8x7eapl2#
我相信这就是您问题的“解决方案”:
我将试着解释我是如何看待它的......首先要知道的是:“COALESCE()与参数具有相同的数据类型。”此
COALESCE(JSON_EXTRACT(price_details, "$.shipping.price"), 0) as coal
返回“0.8648”,但返回的是字符串(varchar),因此它返回““0.8648”“这个
CAST(JSON_EXTRACT(price_details, "$.shipping.price") AS FLOAT) as caast
返回0.8648,所以没有问题...此
select cast('"0.8648"' as float)
返回0,这与您的结果相同...不能将带双引号的值转换为浮点数。当合并浮点数值和等于该浮点数值的0时,将得到一个结果。
我想这就能解释了吧?
DEMO
也许作为补充,我应该问/说这个“098”和这个“098”不一样吗?