JPA 動(dòng)態(tài)條件 SQL 使用 IFNULL() 時(shí),為什么查詢結(jié)果沒有過濾任何行?

JPA 動(dòng)態(tài)條件 SQL 使用 IFNULL() 時(shí),為什么查詢結(jié)果沒有過濾任何行?

在 jpa 動(dòng)態(tài)條件 sql 中遇到 ifNULL() 問題

在使用 jpa 來創(chuàng)建動(dòng)態(tài) sql 條件時(shí),您可能曾嘗試過以下代碼:

where ifnull(nullif(?1,''),'xxx字段')

然而,您注意到了一個(gè)問題:執(zhí)行此代碼后,查詢結(jié)果相當(dāng)于:

where xxx字段 = xxx字段

這是怎么回事,有解決辦法嗎?

回答:

ifnull() 函數(shù)的作用是檢查第一個(gè)參數(shù)是否為 null,如果是,則返回第二個(gè)參數(shù)。在您的情況下,第一個(gè)參數(shù)是可為 null 的變量 ?1,第二個(gè)參數(shù)是字符串 ‘xxx字段’.

mysql 在處理此代碼時(shí),它將執(zhí)行以下操作:

  1. 檢查 ?1 是否為 null。
  2. 如果 ?1 不為 null,則返回它。
  3. 如果 ?1 為 null,則返回 ‘xxx字段’。

然而,最后一種情況永遠(yuǎn)不會(huì)發(fā)生,因?yàn)?nullif() 函數(shù)確保 ?1 永遠(yuǎn)不會(huì)為 null。因此,查詢始終會(huì)執(zhí)行 where xxx字段 = xxx字段,并且不會(huì)過濾任何行。

最佳實(shí)踐建議是使用代碼進(jìn)行條件控制。避免依賴 mysql 來處理空值,因?yàn)樗赡軙?huì)損害性能。此外,在設(shè)計(jì)表時(shí),盡可能避免使用 null 值。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享