Mysql Switch case 返回不正确的结果

标签 mysql

考虑我的 mysql 表中的以下行:

id   Url   Urls
6433       ["https://do.foo/", "https://do.foo/2"]

我需要用 urls 列中的第一个 url 填充 url,只要它是空的。所以我运行了这个查询:

select coalesce(url, '') = '' as `is_true` ,
convert(JSON_EXTRACT(urls, '$[0]'), CHAR) as `extracted`,
case url
    when coalesce(url, '') = '' then convert(JSON_EXTRACT(urls, '$[0]'), CHAR)
    else '3'
end as `valid_url`
from table_name where id = 6433 ; 

结果是:

is_true      extracted          valid_url
1            "https://do.foo/"  3

提取的 url 是否有任何原因未显示在有效 url 列中?

最佳答案

您的 CASE 表达式不正确。当您编写 CASE column WHEN expression 时,column 中的值将与表达式进行比较,因此在您的情况下,您正在比较 url(为 NULL)反对 '',但失败了。将 CASE 表达式更改为 CASE WHEN expression 形式,或将 url 更改为 COALESCE(url, '')'' 的表达式。例如:

select coalesce(url, '') = '' as `is_true` ,
convert(JSON_EXTRACT(urls, '$[0]'), CHAR) as `extracted`,
case 
    when coalesce(url, '') = '' then convert(JSON_EXTRACT(urls, '$[0]'), CHAR)
    else '3'
end as `valid_url`
from table_name where id = 6433

select coalesce(url, '') = '' as `is_true` ,
convert(JSON_EXTRACT(urls, '$[0]'), CHAR) as `extracted`,
case coalesce(url, '')
    when '' then convert(JSON_EXTRACT(urls, '$[0]'), CHAR)
    else '3'
end as `valid_url`
from table_name where id = 6433

两种情况下的输出都是:

is_true     extracted           valid_url
1           "https://do.foo/"   "https://do.foo/"

Demo on dbfiddle

关于Mysql Switch case 返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56320355/

相关文章:

MySQL 配置调整为 1G DB、8GB RAM

mysql - 如何使用 FULLINDEX 对 MySQL 中的两个或更多列进行 MATCH AGAINST?

php - 在php上查看数据时给出默认值

python - Flask SQLAlchemy 连接到 MySQL 数据库

MySQL表分区时间戳

mysql - 在没有密码的情况下输入 mysql 应该不起作用

php - 如何在 yii 1.13 中将所选爱好的 ID 保存在数据库中

mysql - SQL Between 查询无法正常工作

javascript - Post请求在服务器端返回未定义

mysql - Doctrine "on update CURRENT_TIMESTAMP"注释 (Symfony2)