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

结果:

results

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)

推荐答案

您使用了错误的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

  • 如果添加了一个浮点,则会发生什么

Sql相关问答推荐

出现5次后,将所有正斜杠替换为连字符

如何根据给定条件PostgreSQL迭代减少组中的行数

仅在特定字符串之后提取两个圆括号之间的计量单位文本

将结果从一列转换为两行或更多

合并分层表SQL中的第一个非空、变化的空位置

使用左外部联接更正列中第+1行的值时重复

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

SQL 根据前一天的最大值计算每天的值数

识别SQL Server中的重复数字

使用 SQL 计算一年中任意 3 个月期间的总成本

SQL Server: 将JSON对象数组转换为表格格式

多行状态下的分组查询判断状态

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

以 15 分钟为间隔的使用情况SQL 查询

如何在 Trino/Presto 中过滤掉 map 中的某些键?

使用 json_agg 从 SQL 查询获取 [null] 响应

从 Pyspark 转换为具有多个分组条件的语句时的情况

是否有验证 SQL 连接的基数?

过滤具有相同 ID 的前一行具有值特定值的数据

SQL查询,用于从与N ids Timescaledb对应的表中查找时间戳的最新或最大值