Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
where子句中带解码和比较的SQL查询_Sql_Oracle - Fatal编程技术网

where子句中带解码和比较的SQL查询

where子句中带解码和比较的SQL查询,sql,oracle,Sql,Oracle,我对在oracle中编写查询有以下要求 我需要从表T1中获取所有记录,它有两个日期列D1和D2,基于两个动态值V1和V2。这些V1和V2是从应用程序动态传递的。 V1的可能值为“小于”或“大于”。V2的可能值是一个整数 我需要写的问题是: 如果V1被传递为“小于”,V2被传递为5,那么我需要返回T1中的所有行,其中D1-D28 我认为这可以通过where子句中的CASE语句来实现。但不知道如何开始 非常感谢您的帮助。谢谢试试这个: select * from T1 where case when

我对在oracle中编写查询有以下要求

我需要从表T1中获取所有记录,它有两个日期列D1和D2,基于两个动态值V1和V2。这些V1和V2是从应用程序动态传递的。 V1的可能值为“小于”或“大于”。V2的可能值是一个整数

我需要写的问题是:

如果V1被传递为“小于”,V2被传递为5,那么我需要返回T1中的所有行,其中D1-D2<5

如果V1传递为“大于”,V2传递为8,那么我需要返回T1中的所有行,其中D1-D2>8

我认为这可以通过where子句中的CASE语句来实现。但不知道如何开始

非常感谢您的帮助。谢谢

试试这个:

select *
from T1
where case when V1 = 'LESS THAN' THEN D1 - D2 < V2 ELSE D1 - D2 > V2
如果V1不小于,则此假设唯一其他值大于。如有必要,您可以使用多个案例陈述,但这应该可以帮助您开始。

尝试以下方法:

select *
from T1
where case when V1 = 'LESS THAN' THEN D1 - D2 < V2 ELSE D1 - D2 > V2

如果V1不小于,则此假设唯一其他值大于。如有必要,您可以使用多个案例陈述,但这应该可以让您开始。

您可以这样写:

select *
from t1
where (v1 = 'Less Than' and D1 - D2 < v2) or
      (v1 = 'Greater Than' and D1 - D2 > v2)

不需要案例陈述。

您可以这样写:

select *
from t1
where (v1 = 'Less Than' and D1 - D2 < v2) or
      (v1 = 'Greater Than' and D1 - D2 > v2)
不需要case语句。

PL/SQL解决方案,不是直截了当的,但可以针对复杂逻辑进行定制

创建嵌套表sql对象

下面是返回嵌套表的函数

PL/SQL解决方案,不是直截了当的,但可以针对复杂逻辑进行定制

创建嵌套表sql对象

下面是返回嵌套表的函数


将V2存储在变量中,并在where子句中引用该变量。为了基于中的运算符确定查询,您可以动态构建where子句,或者使用If Else子句并执行基本相同的选择,但使用不同的比较运算符如何实现?你的意思是说你有一个变量,它的值可以是“小于”或“大于”?将V2存储在一个变量中,并在where子句中引用它。为了基于中的运算符确定查询,您可以动态构建where子句,或者使用If Else子句并执行基本相同的选择,但使用不同的比较运算符如何实现?你的意思是你有一个变量,它的值可以是“小于”或“大于”?我有相同的解决方案你是第一个,我不会发布我的。我有相同的解决方案你是第一个,我不会发布我的。这在Oracle中不是有效的查询。在case语句中不能有比较运算符,如=。此外,case语句未终止。这在Oracle中不是有效的查询。在case语句中不能有比较运算符,如=。此外,案例陈述没有终止。这对于手头的问题来说是大材小用。你为什么要这样做,而不是使用or?过度复杂可能是@Allan,但不是一个性能不好的,不是吗?只是为了防止更复杂的逻辑。如果减号运算本身是泛型的,比如说加法或其他什么。。环境或条件持续增长。但是这个pl sql,也是这样工作的。可能会帮助某人,这就是为什么我在回答中提到它作为第一点。实际上,性能会比它应该的更差。因为您在连接变量,所以优化器需要为每个变量制定一个单独的计划。你无缘无故地破坏了缓存。您还消除了使用SQL本机语言的优势:不是在编译时验证SQL语法,而是在运行时验证。随着你的函数变得越来越复杂,SQL被破坏的可能性也越来越大。更新了答案。我只是想为PL/SQL的使用提供一个提示。这对于手头的问题来说是一个极大的夸张。你为什么要这样做,而不是使用or?过度复杂可能是@Allan,但不是一个性能不好的,不是吗?只是为了防止更复杂的逻辑。如果减号运算本身是泛型的,比如说加法或其他什么。。环境或条件持续增长。但是这个pl sql,也是这样工作的。可能会帮助某人,这就是为什么我在回答中提到它作为第一点。实际上,性能会比它应该的更差。因为您在连接变量,所以优化器需要为每个变量制定一个单独的计划。你无缘无故地破坏了缓存。您还消除了使用SQL本机语言的优势:不是在编译时验证SQL语法,而是在运行时验证。随着你的函数变得越来越复杂,SQL被破坏的可能性也越来越大。更新了答案。我只是想为PL/SQL的使用提供一个提示。
select * FROM TABLE(check_me(',',5));