MySQL ifnull的嵌套使用說明
MySQL ifnull的嵌套使用
在網(wǎng)上查詢ifnull有沒有嵌套使用的方式,但是貌似沒有人提到過這個用法:大都是簡單的判斷一個字段是否為空,然后用另外一個值代替的方式使用;
即是:
select ifnull(a,b) from A ;
但是我遇到的問題是兩個字段,大概場景是這樣的:
每一個商店會有兩種打折方式vip_discount與simple_discount,從數(shù)據(jù)庫查出來以discount字段命名;且以vip_discount為主。
意思是如果vip_discount不為空,就返回它的值,若它的值為空就要進一步判斷simple_discount字段是否為空,如果不為空就返回simple_discount的值,否則就返回一個空字符串。
這里我就想到了可不可以使用ifnull嵌套來判斷達到我的目的。
在網(wǎng)上查了許久也沒有發(fā)現(xiàn)有類似的博客,就尋思自己試試不就行啦:
select ifnull(vip_discount,ifnull(simple_discount,"")) as discount from A;
這樣就解決問題了,此SQL語句也可以在后面添加條件語句來補充其他條件查詢。
MYSQL之ifnull的那些坑
廢話不多說,直接看SQL:
UPDATE
lb_user u
SET u.user_level = (
SELECT
IFNULL(levelid, u.user_level)
FROM lb_user_level
WHERE `status` = 1 AND levelid > u.user_level
AND (upgrade_score < u.empirical OR upgrade_total_money < u.total_consumption_money)
ORDER BY levelid DESC
LIMIT 1
);
這個SQL乍一看沒什么問題,執(zhí)行的時候也成功了,可再次執(zhí)行就修改出錯,原因是根據(jù)當前的條件無法檢索出數(shù)據(jù),返回數(shù)據(jù)為空,注意是數(shù)據(jù)為空,沒有這條數(shù)據(jù),而不是有這條數(shù)據(jù)存在該字段為空,經(jīng)過排查,修改SQL如下:
UPDATE
lb_user u
SET u.user_level = IFNULL((
SELECT
levelid
FROM lb_user_level
WHERE `status` = 1 AND levelid > u.user_level
AND (upgrade_score < u.empirical OR upgrade_total_money < u.total_consumption_money)
ORDER BY levelid DESC
LIMIT 1
), u.user_level);
經(jīng)過修改后執(zhí)行就成功了,并且不存在IFNULL失效的情況;
總結原因是因為:
MYSQL中IFNULL僅可以判斷該數(shù)據(jù)存在的情況下為NULL,而不能判斷該條數(shù)據(jù)沒有查詢到而為NULL的情況。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mysql中l(wèi)ower_case_table_names=1參數(shù)的作用
lower_case_table_names是MySQL數(shù)據(jù)庫中的一個系統(tǒng)變量,本文主要介紹了mysql中l(wèi)ower_case_table_names=1參數(shù)的作用,具有一定的參考價值,感興趣的可以了解一下2024-08-08
my.cnf參數(shù)配置實現(xiàn)InnoDB引擎性能優(yōu)化
目前來說:InnoDB是為Mysql處理巨大數(shù)據(jù)量時的最大性能設計。它的CPU效率可能是任何其它基于磁盤的關系數(shù)據(jù)庫引擎所不能匹敵的。在數(shù)據(jù)量大的網(wǎng)站或是應用中Innodb是倍受青睞的。另一方面,在數(shù)據(jù)庫的復制操作中Innodb也是能保證master和slave數(shù)據(jù)一致有一定的作用。2017-05-05

