Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Sql 甲骨文:真正的价值在哪里_Sql_Oracle - Fatal编程技术网

Sql 甲骨文:真正的价值在哪里

Sql 甲骨文:真正的价值在哪里,sql,oracle,Sql,Oracle,我正在函数中构建一个SQL查询。函数参数是WHERE子句的标准。参数也可以为null foo (1,2,3) => SELECT x FROM y WHERE a=1 AND b=2 AND c=3; foo (null, 2, null) => SELECT x FROM y WHERE b=2; 我在代码中这样做的方法是在WHERE子句中添加一个非常首次的true,例如1=1或NULL为NULL或2>1 所以我不需要处理第一个WHERE条件在a

我正在函数中构建一个SQL查询。函数参数是WHERE子句的标准。参数也可以为null

foo (1,2,3)           =>   SELECT x FROM y WHERE a=1 AND b=2 AND c=3;
foo (null, 2, null)   =>   SELECT x FROM y WHERE b=2;
我在代码中这样做的方法是在WHERE子句中添加一个非常首次的true,例如1=1或NULL为NULL或2>1

所以我不需要处理第一个WHERE条件在a WHERE之后,所有其他条件都在a and之后的问题

String sql="SELECT x FROM y WHERE 1=1";
if (a!=null)
{
  sql += " AND a="+a;
}

是否有比1=1或我的其他示例更好的术语显式地具有始终为真的值?TRUE和FALSE不起作用。

我从未真正理解在没有条件的情况下强制执行where子句的方法。如果您正在构造逻辑,那么请组合这些条件。如果结果字符串为空,则完全省略where子句

例如,在Python中,许多应用程序语言具有与concat_ws-string连接等效的分隔符连接。因此,省略where子句甚至不会产生更复杂的代码


至于你的问题,Oracle没有布尔值,因此1=1可能是最常见的方法。

我从来没有真正理解在没有条件的情况下强制使用where子句的方法。如果您正在构造逻辑,那么请组合这些条件。如果结果字符串为空,则完全省略where子句

例如,在Python中,许多应用程序语言具有与concat_ws-string连接等效的分隔符连接。因此,省略where子句甚至不会产生更复杂的代码


至于您的问题,Oracle没有布尔值,因此1=1可能是最常见的方法。

使用NVL,以便设置默认值。查找NVL或NVL2。这两种都可能对你有用。
签出:

使用NVL,以便设置默认值。查找NVL或NVL2。这两种都可能对你有用。
签出:

在sql中,默认为null的标准方法是使用coalesce。假设您的输入是@p1、@p2和@p3

然后

因此,例如@p1为空,则它将比较始终为真的a=a。如果@p1不为空,则它将根据等于该值的值进行过滤


这样,null就成为所有记录的通配符。

在sql中,默认null的标准方法是使用合并。假设您的输入是@p1、@p2和@p3

然后

因此,例如@p1为空,则它将比较始终为真的a=a。如果@p1不为空,则它将根据等于该值的值进行过滤


通过这种方式,null将成为所有记录的通配符。

您还可以使用decode获得所需的结果,因为它是oracle

Select 
decode(a, 1, x,null),
decode(b, 2, x,null),
decode(c, 3, x,null)
from y

您还可以使用decode获得所需的结果,因为它是oracle

Select 
decode(a, 1, x,null),
decode(b, 2, x,null),
decode(c, 3, x,null)
from y
当AND位于括号外时,使用括号或括号内的AND如何

SELECT x 
  FROM y 
 WHERE ( a=:prm1 OR :prm1 is null) 
   AND ( b=:prm2 OR :prm2 is null) 
   AND ( c=:prm3 OR :prm3 is null);
当AND位于括号外时,使用括号或括号内的AND如何

SELECT x 
  FROM y 
 WHERE ( a=:prm1 OR :prm1 is null) 
   AND ( b=:prm2 OR :prm2 is null) 
   AND ( c=:prm3 OR :prm3 is null);

Oracle不支持SQL中的布尔类型。它存在于PL/SQL中,但不能用于查询。最简单的方法是1=1表示真,0=1表示假。我不确定优化器是否会优化这些,但我怀疑性能影响可以忽略不计。我使用过这个方法,在运行时之前谓词的数量是未知的

我认为这种构造优于使用nvl、coalesce、decode或case的任何构造,因为这些构造绕过了正常索引,我已经让它们导致复杂而缓慢的执行计划

所以,是的,我会做一些事情,比如你不确定你用什么语言构建这个查询;这是无效的PL/SQL。您还应该使用绑定变量,但这是另一种情况:

sql = "SELECT x FROM y WHERE 1=1";
if (a != null)
{
    sql += " AND a=" + a;
}
if (b != null)
{
    sql += " AND b=" + b;
}
... etc.

我认为这比Gordon Linoff的建议要好,因为否则这会更复杂,因为每个谓词都必须有另一个子句来检查是否有前一个谓词,即是否需要包含AND。它只是使代码更加冗长,以避免查询中出现一个简单的子句。

Oracle不支持SQL中的布尔类型。它存在于PL/SQL中,但不能用于查询。最简单的方法是1=1表示真,0=1表示假。我不确定优化器是否会优化这些,但我怀疑性能影响可以忽略不计。我使用过这个方法,在运行时之前谓词的数量是未知的

我认为这种构造优于使用nvl、coalesce、decode或case的任何构造,因为这些构造绕过了正常索引,我已经让它们导致复杂而缓慢的执行计划

所以,是的,我会做一些事情,比如你不确定你用什么语言构建这个查询;这是无效的PL/SQL。您还应该使用绑定变量,但这是另一种情况:

sql = "SELECT x FROM y WHERE 1=1";
if (a != null)
{
    sql += " AND a=" + a;
}
if (b != null)
{
    sql += " AND b=" + b;
}
... etc.
我认为这比Gordon Linoff的建议要好,因为否则这会更复杂,因为每个谓词都必须有另一个子句来检查是否有前一个谓词,即
r您需要包含AND或not。这只会使代码更加冗长,以避免查询中出现一个简单的子句。

这正是我在问题中所说的——但我要求用更好的术语表示always TRUE,而不是1=1。这正是我在问题中所说的——但我要求用更好的术语表示always TRUE,而不是1=1。