【问题标题】:Oracle-Making condition optional in Select statement在 Select 语句中使 Oracle 条件可选
【发布时间】:2019-10-05 14:51:14
【问题描述】:

如何使条件可选? 也就是说,如果where子句的某个条件为FALSE,那么如何用最简单的方式忽略这个条件呢?

我的代码的预期结果是,

RR
--
100
200

我的代码是,

WITH DATASET AS ( 
  SELECT 1 A, 10 B, 100 RR FROM DUAL
  UNION
  SELECT NULL A, 10 B, 200 RR FROM DUAL
)
SELECT RR
FROM DATASET
WHERE 
A=2  -- How to make this condition optional(that is, as 2 is not found then,ignoring this condition)
AND 
B=10 
;

【问题讨论】:

  • OR 代替 AND 不起作用吗?或者你必须更好地解释你想要什么。
  • 将其设为“可选”是什么意思?如果我们按字面解释,它应该意味着您可以简单地从where 子句中完全删除该条件。可能不是你真正的意思。根据您提供的数据,也许您的意思是 A 应该是 2 或者 A 应该是 NULL?请澄清。另外,请注意WHERE 子句中的要求称为条件,而不是约束。这很重要,因为“约束”在 Oracle 中也是一个技术词,具有完全不同的含义。我将编辑您的帖子以更正。

标签: sql oracle select where-clause


【解决方案1】:

我知道,如果所有数据中不存在 2,您不想过滤,但如果 A 列中有 2,那么您想要过滤。

试试这个:

解决方案 1:

SELECT * FROM 
(
WITH DATASET AS ( 
  SELECT 1 A, 10 B, 100 RR FROM DUAL
  UNION
  SELECT NULL A, 10 B, 200 RR FROM DUAL
)
SELECT  
RR
FROM
DATASET
WHERE B=10 
AND EXISTS
(
SELECT 1 FROM DATASET WHERE A=2
)
)
UNION 
SELECT * FROM 
(
WITH DATASET AS ( 
  SELECT 1 A, 10 B, 100 RR FROM DUAL
  UNION
  SELECT NULL A, 10 B, 200 RR FROM DUAL
)
SELECT  
RR
FROM
DATASET
WHERE B=10 
AND NOT EXISTS
(
SELECT 1 FROM DATASET WHERE A=2
)
)

解决方案2:

WITH DATASET AS ( 
  SELECT 1 A, 10 B, 100 RR FROM DUAL
  UNION
  SELECT NULL A, 10 B, 200 RR FROM DUAL
)
,SUB AS (
SELECT DISTINCT 1 A_EXISTS,RR
FROM DATASET
WHERE A=2
),
SUB2 AS (
SELECT DISTINCT
CASE 
  WHEN SUB.A_EXISTS IS NOT NULL AND DATASET.A=2
    THEN SUB.RR
  WHEN SUB.A_EXISTS IS NOT NULL AND DATASET.A<>2
    THEN NULL
  ELSE DATASET.RR
END RR
FROM
DATASET
FULL OUTER JOIN SUB ON A_EXISTS=1
WHERE  DATASET.B=10  
)
SELECT
*
FROM SUB2
WHERE RR IS NOT NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多