MariaDB中CAST()和COALESCE()事务的顺序

qgzx9mmu  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(195)

我有一个奇怪的问题:在表的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)

xmakbtuz

xmakbtuz1#

您使用了错误的JSON函数。
JSON_EXTRACT()返回一个在该路径找到的JSON对象,这就是为什么在你的小提琴上仍然会看到双引号。
您希望从特定路径返回标量值,因此使用JSON_VALUE()

SELECT
    item_id,
    JSON_VALUE(price_details, "$.shipping.price") AS shipprice,
    CAST(COALESCE(JSON_VALUE(price_details, "$.shipping.price"), '0') AS FLOAT) AS shippricecoalfloat,
    COALESCE(CAST(JSON_VALUE(price_details, "$.shipping.price") AS FLOAT), 0) AS shippricefloatcoal
FROM `item`
WHERE order_id = 109517;

另外,数据类型“混乱”的部分原因是JSON将一些值存储为带双引号的字符串,而将一些值存储为数字值。我强烈建议不要在JSON中将数字值用双引号括起来。
https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=d67fa297a5cc4248a06750d71581c022

  • 添加了一个额外的表达式,以显示如果合并浮点数与整数,以及合并浮点数与浮点数,会发生什么
o8x7eapl

o8x7eapl2#

我相信这就是您问题的“解决方案”:

select cast('"0.8648"' as float)

我将试着解释我是如何看待它的......首先要知道的是:“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”不一样吗?

相关问题