mysql - 在 MySQL 中,如何将 JSON_OBJECT 中的 VARCHAR 转换为 UNSIGNED?

标签 mysql sql json casting

假设一个表有两列,AB,均为 VARCHAR 类型:

|------------|-------------|
|      A     |     B       |
|------------|-------------|
|  EMPLOYEE  |    34       |
|------------|-------------|
|   OTHER    |  mystring   |
|------------|-------------|

我希望 B 列作为 JSON_OBJECT。如果 A 列的值为“EMPLOYEE”,我想将 B 列中的值转换为整数。该查询如下所示:

SELECT A, 
JSON_OBJECT(
   'key', IF(A = 'EMPLOYEE', CAST(B AS UNSIGNED), B)
) as B
FROM table

结果:

|------------|----------------------|
|      A     |          B           |
|------------|----------------------|
|  EMPLOYEE  |    {"key": "34"}     | // Expected {"key": 34} here
|------------|----------------------|
|   OTHER    |  {"key": "mystring"} |
|------------|----------------------|

问题是转换将值 34 作为字符串保留在结果 JSON 中,但我希望它作为整数。我已经通过使用 TRUE 作为条件确认了强制转换实际上正在运行,但 json 仍然包含一个字符串。

我能够让 Actor 工作的一种方法是添加 WHERE A = 'EMPLOYEE',但我不知道为什么我无法在没有WHERE 子句。我怎样才能让这个 Actor 阵容正常工作?

最佳答案

您的查询的问题是 if()强制其两个分支返回的值采用一致的数据类型;大多数其他表达式也是如此,例如 case ,或类似 coalesce() 的函数, least()/greatest() ,等等。因此,即使您尝试强制使用两种不同的数据类型,隐式转换也会发生。

在您的用例中,一种解决方案是移动 casejson_object() 。这样,两个分支都会返回 json数据类型,其中 if() (或 case )满足于:

select 
    a, 
    case a
        when 'EMPLOYEE' then json_object('key', cast(b as unsigned))
        else json_object('key', b)
    end b
from mytable

<强> Demo on DB Fiddle :

a        | b                  
:------- | :------------------
EMPLOYEE | {"key": 34}        
OTHER    | {"key": "mystring"}

关于mysql - 在 MySQL 中,如何将 JSON_OBJECT 中的 VARCHAR 转换为 UNSIGNED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59326314/

相关文章:

java - Hibernate中的ObjectNotFoundException : No row with the given identifier exists

mysql - 需要从 Drupal MySQL 数据库中删除未引用的行

mysql - 查询日期范围内也具有指定子字符串的行

javascript - 使用 jQuery 解析外部 JSON 文件

javascript - 将javascript对象转换为有序的逗号分隔值

c++ - 设置 : C++ in VS Code under Linux (tasks. json 和 launch.json)

php - 使用 PHP 验证电子邮件

mysql - 创建失败: Key column 'name' doesn't exist in table:

mysql - 如何计算 mysql 数据库中结果列的百分比

php - 如何防止 PHP 中的 SQL 注入(inject)?