SQL查询where子句如果没有匹配记录则忽略

约翰尼朱布

我目前正在使用一个SQL查询,该查询从具有20列的复杂SQL视图中读取数据。我应该使用8 where条件读取数据。在这8个条件中,一个条件是可选的。这意味着,如果没有满足所有这8个条件的匹配记录,则忽略该可选where条件并返回结果。

这是进一步解释此问题的示例:

表格:: EMPLOYEE_DETAILS

EMP_NO  EMP_NAME    EMP_DEPT_NO     PREF_LANGUAGE       LOCATION
------  --------    -----------     -------------       ---------
1       Name1       101             ENGLISH             USA
2       Name2       102             SPANISH             SPAIN
3       Name3       103             ENGLISH             USA 
4       Name4       102             ITALIAN             ITALY
5       Name5       103             ENGLISH             USA
6       Name6       103             ITALIAN             ITALY

查询:

SELECT * FROM EMPLOYEE_DETAILS
    WHERE EMP_DEPT_NO = 103 AND LOCATION ='USA' AND PREF_LANGUAGE = 'SPANISH'

在此示例sql查询中,PREF_LANGUAGE条件是可选的。
如果存在所有三个条件都匹配的记录,则仅返回那些匹配的记录。由于上表没有与所有三个条件都匹配的记录,因此查询应省略可选条件(即PREF_LANGUAGE),并得出与其余两个必需条件匹配的记录。

非常感谢您的帮助。

谢谢

戈登·利诺夫

我想我会对查询进行如下调整:

WITH cte AS (
      SELECT ed.*,
             SUM(CASE WHEN PREF_LANGUAGE = 'SPANISH' THEN 1 ELSE 0 END) OVER () as NUM_PREF_SPANISH
      FROM EMPLOYEE_DETAILS ed
      WHERE EMP_DEPT_NO = 103 AND LOCATION = 'USA'
     )

SELECT *
FROM cte
WHERE PREF_LANGUAGE = 'SPANISH' OR
      NUM_PREF_LANGUAGE = 0;

用这种方式表述的原因是Oracle并不总是实现CTE。这样可以保证CTE仅被引用一次,因此优化程序不会多次运行复杂的代码。

您还可以使用WITH TIES技巧在最新版本的Oracle中执行此操作

SELECT ed.*,                 
FROM EMPLOYEE_DETAILS ed
WHERE EMP_DEPT_NO = 103 AND LOCATION = 'USA'
ORDER BY(CASE WHEN PREF_LANGUAGE = 'SPANISH' THEN 1 ELSE 2 END)
FETCH FIRST 1 ROW WITH TIES;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当where in子句中没有值时如何执行查询

没有指定列列表的SQL复制记录;忽略身份

SQL查询结果需要返回WHERE子句中的所有记录,甚至重复

SQL查询类似于带有AND条件而不是OR的IN where子句

SQL查询where子句对代码号的过滤如何获取所有没有过滤的记录?

SQL忽略WHERE子句

Postgres SQL WHERE子句在模式匹配中带有“ OR”

没有WHERE子句的SQL内部联接

为什么我的SQL查询返回的记录与where子句不匹配?

我该如何进行SQL查询,如果没有记录则返回null,如果有记录则返回值?

SQL Server:自我连接-检索与where子句匹配的记录以及别名表中没有记录时

在WHERE子句字段中没有None的Django SQL查询不起作用

如果没有记录计数,则显示零-ORACLE SQL查询

在where子句中具有相关子查询的SQL查询

SQL查询忽略WHERE子句并给出奇怪的结果

忽略WHERE子句的SQL查询,返回整个数据集

为什么此查询忽略WHERE子句?

当我有总和时忽略WHERE子句的查询

SQL中的WHERE子句忽略OR

SQL查询中带有总和的Where子句

如果没有提供过滤器,则忽略Laravel数据库查询中的“ where”子句

带有 WHERE 子句的抽象具体 SQL 查询

如果没有找到匹配的记录,通知用户 - Coldfusion

带有 Where/Having 子句的 SQL 查询案例

SQL Server:自联接查询;仅选择与名字匹配且没有 where 语句的记录

使用没有 WHERE 子句的外连接时,SQL 语句会忽略我的日期条件

如果 Laravel 没有提供查询,如何忽略“where 子句”

SQL - IN 子句没有匹配项

有没有办法强制 MySQL 选择查询在 where 子句之前解决 have 子句?