SQL查询:将可为空列转为布尔值时出现语法错误求助
解决SQL中将可为空列转换为布尔值(1/0)的语法错误问题
看起来你遇到的问题是不是所有SQL数据库都支持直接将IS NOT NULL的布尔结果作为列返回,这就是为什么你会收到"Incorrect syntax near the keyword 'IS'"的报错。不同的SQL方言处理这种转换的方式略有不同,下面给你几种通用和数据库专属的解决方案:
通用跨数据库方案:使用CASE表达式
这是最稳妥的写法,几乎所有主流数据库都支持:
SELECT name AS UserName, age AS UserAge, CASE WHEN birthday IS NOT NULL THEN 1 ELSE 0 END AS HasEnteredBirthday FROM users;
这个语句会检查birthday是否不为空,是的话返回1,否则返回0,正好符合你期望的结果(Peter 31 1、Greg 54 0)。
针对特定数据库的简化写法
如果你用的是特定数据库,还可以用更简洁的语法:
- MySQL/MariaDB:直接支持你的原写法,不过如果还是报错,也可以用
IF函数:SELECT name AS UserName, age AS UserAge, IF(birthday IS NOT NULL, 1, 0) AS HasEnteredBirthday FROM users; - SQL Server 2012+:可以用
IIF函数简化:SELECT name AS UserName, age AS UserAge, IIF(birthday IS NOT NULL, 1, 0) AS HasEnteredBirthday FROM users; - PostgreSQL:你的原写法其实是有效的,但如果需要确保返回数值而不是布尔类型,可以用
CAST转换:SELECT name AS UserName, age AS UserAge, CAST((birthday IS NOT NULL) AS INT) AS HasEnteredBirthday FROM users; - Oracle:可以用
NVL2函数:SELECT name AS UserName, age AS UserAge, NVL2(birthday, 1, 0) AS HasEnteredBirthday FROM users;
为什么原语句会报错?
像SQL Server这类数据库,IS NOT NULL返回的是布尔类型,但数据库不允许直接将布尔类型作为列值返回(除非你显式转换),所以必须用CASE、IIF这类函数把布尔结果转换成整数1或0。
内容的提问来源于stack exchange,提问作者stefan
相关产品推荐
相关产品推荐

