SQL视图是基于SQL查询结果的虚拟表,在实际业务场景中,我们常常需要在创建视图时过滤掉包含空值的行,保证视图返回的数据都是有效可用的,这时候就需要用到WHERE NOT NULL条件。

什么是SQL视图中的空行
SQL视图中的空行指的是查询结果里某一列或者多列的值为NULL的行,NULL表示值不存在,既不是空字符串也不是0。空行通常会在以下场景中出现:
- 源表插入数据时没有给某些非必填字段赋值,这些字段就会存储为NULL
- 多表关联查询时,关联条件不匹配导致部分字段没有对应的值,出现NULL
- 对字段进行计算或者转换时,遇到无效数据返回NULL
WHERE NOT NULL条件的基本用法
WHERE NOT NULL条件的作用是筛选出指定列的值不为NULL的行,基本语法是在WHERE子句中添加列名 IS NOT NULL的判断。需要注意的是,判断NULL值不能用等于号,必须用IS NULL或者IS NOT NULL。
单字段过滤空行
如果只需要过滤某一列存在空值的行,直接在WHERE子句中添加对应列的IS NOT NULL判断即可。以下是一个创建视图时过滤单字段空行的示例,假设我们有一个用户表user_info,需要创建视图过滤掉手机号字段为空的行:
-- 创建用户视图,过滤手机号为空的行 CREATE VIEW valid_user_view AS SELECT user_id, user_name, phone, register_time FROM user_info WHERE phone IS NOT NULL;
多字段过滤空行
如果需要同时过滤多个字段的空行,可以用AND关键字连接多个IS NOT NULL条件。比如我们需要创建订单视图,同时过滤订单金额和支付时间为空的行:
-- 创建有效订单视图,过滤订单金额和支付时间为空的行 CREATE VIEW valid_order_view AS SELECT order_id, user_id, order_amount, pay_time, create_time FROM order_info WHERE order_amount IS NOT NULL AND pay_time IS NOT NULL;
不同数据库中的适配说明
大部分关系型数据库都支持IS NOT NULL语法,但是部分数据库有一些细微差异,以下是常见数据库的适配情况:
| 数据库类型 | 适配说明 |
|---|---|
| MySQL | 完全支持IS NOT NULL语法,视图创建时可以直接使用 |
| PostgreSQL | 支持IS NOT NULL,同时也可以用<> NULL判断,但是推荐使用标准IS NOT NULL |
| SQL Server | 支持IS NOT NULL,视图创建语法和MySQL基本一致 |
| Oracle | 支持IS NOT NULL,同时需要注意空字符串在Oracle中会被视为NULL |
过滤空行的注意事项
在使用WHERE NOT NULL条件过滤SQL视图空行时,需要注意以下几点:
- 不要混淆NULL和空字符串,空字符串是有效值,不会被IS NOT NULL过滤掉,如果需要过滤空字符串,需要额外添加<> ''的判断
- 如果视图基于多表关联查询创建,需要明确要过滤的是关联后的字段空值,还是源表的字段空值,避免过滤掉有效数据
- 修改视图定义时,需要重新执行CREATE OR REPLACE VIEW语句,原有的过滤条件会覆盖更新
- 如果过滤的字段是主键,通常主键不会存在空值,不需要额外添加IS NOT NULL条件
验证过滤效果
创建完视图之后,可以查询视图的数据验证空行是否被正确过滤。比如查询上面创建的有效用户视图,查看是否还有手机号为空的行:
-- 查询有效用户视图,验证手机号是否为空 SELECT user_id, user_name, phone FROM valid_user_view WHERE phone IS NULL;
如果查询结果为空,说明空行已经被正确过滤。
SQL视图WHERE_NOT_NULL空行过滤视图创建修改时间:2026-07-07 22:30:25