假设一个表有两列,A
和 B
,均为 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()
,等等。因此,即使您尝试强制使用两种不同的数据类型,隐式转换也会发生。
在您的用例中,一种解决方案是移动 case
出json_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/