如何编写SQL查询:按指定name检索,匹配返回主键id否则返回NULL
需求背景
现有数据库表结构如下:
create table foo(id integer primary key, name varchar(128) unique not null);
需要实现查询逻辑:传入指定的name值做检索,存在匹配记录就返回对应的主键id,不存在匹配记录则返回NULL。效果和LEFT JOIN的空值返回逻辑一致,但当前场景没有现成的左表可用。
实现方式
有两种通用写法可以满足要求,均适配标准SQL语法:
写法1:构造参数表做左连接(全数据库兼容)
核心思路是自己构造一个仅包含待查询name的单值结果集作为左表,再和foo表做左连接,利用左连接的特性返回结果:
SELECT t.id FROM ( -- 将引号内内容替换为实际要检索的name值 SELECT '待查询的目标name值' AS search_name ) AS search_param LEFT JOIN foo t ON t.name = search_param.search_name;
逻辑说明:
- 内层子查询固定返回1行传入的查询参数,作为左连接的驱动表
- 如果foo表存在name匹配的记录,会正常返回对应的id;如果没有匹配项,左连接会自动把右表的id字段置为NULL返回,完全匹配需求。
写法2:标量子查询写法(支持无FROM子句查询的数据库可用)
如果使用的是MySQL、PostgreSQL、SQLite等支持直接执行不带FROM子句SELECT语句的数据库,可以用更简洁的标量子查询实现:
-- 将引号内内容替换为实际要检索的name值 SELECT (SELECT id FROM foo WHERE name = '待查询的目标name值') AS id;
逻辑说明:
- 括号内的子查询是标量查询,因为name字段加了唯一约束,最多只会返回1条记录的id值
- 如果查询不到匹配记录,这个子查询的返回值就是NULL,外层SELECT直接返回该值即可,效果和左连接写法完全一致,且因为有唯一索引,查询性能很高。
注意:因为表中name字段是
unique not null的,上述两种写法都不会出现返回多行数据的异常,可以直接使用。
内容的提问来源于stack exchange,提问作者user209974
相关产品推荐
相关产品推荐

