Android 9/10设备使用CASE WHEN TRUE触发SQLiteException求助
SQLite布尔值兼容性问题解答
问题原因
确实和设备搭载的SQLite版本直接相关:
- Android 13内置的SQLite版本较高(通常为3.38及以上),支持将
TRUE/FALSE作为布尔常量解析; - Android 9、10内置的SQLite版本较低(Android 9对应SQLite 3.22,Android 10对应SQLite 3.28),这些版本没有内置
TRUE/FALSE常量,SQLite会将其识别为列名,从而抛出no such column: TRUE的错误。
向后兼容的写法
有两种可靠的兼容方案:
方案1:用整数1/0替代布尔常量
SQLite中布尔类型本质是整数存储,1代表真,0代表假,直接替换即可:
SELECT * FROM portfolio JOIN holdingCalculations ON portfolio.uid = holdingCalculations.uid ORDER BY calc_num_transactions = 0, CASE use_local_currency_for_totals WHEN 1 THEN calc_total_change_percent_local ELSE calc_total_change_percent END DESC, portfolio.name COLLATE NOCASE
方案2:简化CASE条件判断
直接将布尔列作为CASE的判断条件,无需显式对比TRUE:
SELECT * FROM portfolio JOIN holdingCalculations ON portfolio.uid = holdingCalculations.uid ORDER BY calc_num_transactions = 0, CASE WHEN use_local_currency_for_totals THEN calc_total_change_percent_local ELSE calc_total_change_percent END DESC, portfolio.name COLLATE NOCASE
内容的提问来源于stack exchange,提问作者mliu
相关产品推荐
相关产品推荐

