Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
与PostgreSQL中的任何运算符相比_Sql_Database_Postgresql_Rdbms_Sql In - Fatal编程技术网

与PostgreSQL中的任何运算符相比

与PostgreSQL中的任何运算符相比,sql,database,postgresql,rdbms,sql-in,Sql,Database,Postgresql,Rdbms,Sql In,中的与PostgreSQL中的任何运算符有什么区别? 两者的工作机制似乎是相同的。有人能举例说明吗?(无论是中的还是ANY都不是“运算符”,“构造”或“语法元素”。) 逻辑上,: 中的相当于=ANY 但是中的有两个语法变体和ANY的两个变体。详情: 在获取一个集合相当于=任何获取一个集合,如下所示: 但每一种的第二种变体并不等同于另一种。ANY构造的第二个变量采用数组(必须是实际的数组类型),而中的的第二个变量采用逗号分隔的值列表。这会导致传递值时受到不同的限制,在特殊情况下也会导致

中的
与PostgreSQL中的任何
运算符有什么区别?
两者的工作机制似乎是相同的。有人能举例说明吗?

(无论是
中的
还是
ANY
都不是“运算符”,“构造”或“语法元素”。)

逻辑上,:

中的
相当于
=ANY

但是
中的
有两个语法变体
ANY的两个变体
。详情:

获取一个集合相当于
=任何
获取一个集合,如下所示:

但每一种的第二种变体并不等同于另一种。
ANY
构造的第二个变量采用数组(必须是实际的数组类型),而
中的
的第二个变量采用逗号分隔的值列表。这会导致传递值时受到不同的限制,在特殊情况下也会导致不同的查询计划:

ANY
更通用
ANY
构造的用途要多得多,因为它可以与各种操作符组合,而不仅仅是
=
。例如:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
对于大量值,为每个值提供一组更好的比例:

相关的:

倒置/相反/排除 “查找
id
位于给定数组中的行:”

反转:“查找数组中
id
的行:”


有两个明显的要点,以及另一个答案中的要点:

  • 使用子查询时,它们完全等效:

    SELECT * FROM table
    WHERE column IN(subquery);
    
    SELECT * FROM table
    WHERE column = ANY(subquery);
    
另一方面:

  • 只有
中的
操作符允许一个简单的列表:

SELECT * FROM table
WHERE column IN(… , … , …);

假设它们完全相同,我好几次都忘记了
ANY
不适用于列表。

这可能重复回答了你的问题吗?最好明确说明第二种变体的结果总是相同的。我99%确信事实确实如此,但答案似乎没有说明这一点。这意味着,
SELECT*from mytable,其中(1,2,3)中的id
将始终产生与
SELECT*from mytable,其中id=ANY(“{1,2,3}”)
相同的行,即使它们可能具有不同的查询计划。
ANY
不能与
组合=操作员。我认为没有文档记录,但是
select*from foo where id!=ANY(数组[1,2])
select*from foo不同,其中id不在(1,2)
。另一方面,
select*from foo where NOT(id=ANY(数组[1,2])
按预期工作。@qris:
ANY
可以与
组合使用=操作员。但还有更多。我在上面加了一章。(请注意,
是标准SQL中的运算符-尽管在Postgres中也接受
!=
)包含
NULL
值的最新版本如何工作?将
其中id=ANY(数组[1,2])或id为NULL也可以吗?@dvtan:
(id=…)不为真
有效,因为
id=…
只有在存在实际匹配时才计算为
TRUE
。结果
FALSE
NULL
通过我们的测试。请参阅:。您添加的表达式测试了其他内容。这相当于
,其中id ALL(数组[1,2])或id为NULL
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
SELECT * FROM table
WHERE column IN(subquery);

SELECT * FROM table
WHERE column = ANY(subquery);
SELECT * FROM table
WHERE column IN(… , … , …);