sql - 基于case语句的SQL过滤器
问题描述
我有一些接近下面例子的逻辑:
SELECT
employee.num,
CASE job.type
WHEN 'C' THEN chemical.chem_status
ELSE physical.phys_status
END AS attr_status
FROM employee
LEFT JOIN job ON employee.key = job.key
LEFT JOIN physical ON physical.key = job.key
LEFT JOIN chemical ON chemical.key = job.key
WHERE attr_status = 'A'
关于如何实现这一目标的任何建议?
谢谢你。
解决方案
因为在大多数(或所有?)DBMS 系统中,您不能在 WHERE 子句中使用别名,因此您有 2 个选项:
attr_status
用CASE 的副本替换WHERE 子句
SELECT
employee.num,
CASE job.type
WHEN 'C' THEN chemical.chem_status
ELSE physical.phys_status
END AS attr_status
FROM employee
LEFT JOIN job ON employee.key = job.key
LEFT JOIN physical ON physical.key = job.key
LEFT JOIN chemical ON chemical.key = job.key
WHERE CASE job.type
WHEN 'C' THEN chemical.chem_status
ELSE physical.phys_status
END = 'A'
- 使您的查询成为子查询:
SELECT *
FROM (
SELECT
employee.num,
CASE job.type
WHEN 'C' THEN chemical.chem_status
ELSE physical.phys_status
END AS attr_status
FROM employee
LEFT JOIN job ON employee.key = job.key
LEFT JOIN physical ON physical.key = job.key
LEFT JOIN chemical ON chemical.key = job.key
) x
WHERE x.attr_status = 'A'
推荐阅读
- mysql - 创建用于更新生产数据库的脚本
- java - 如何使用 Undertow 返回要在 Java 中下载的文件?
- android - npm run android 挂起“加载依赖图,完成”(BlueWallet)
- c++ - 显示然后删除链表 C++
- gcov - lcov 分别是 geninfo 无法读取 gcda 文件
- r - R dopar foreach 块而不是每行
- angular - Angular-Testing:如何使用 TestBed 为服务类提供配置对象?
- javascript - JQuery:“addClass 不能按 id 工作”,当文档准备好时
- php - laravel 应用程序中的文件更改未反映在网页上
- c# - 如果匹配特定搜索词,则替换数组中的值 - O(n^2)