Oracle:'= ANY()'与'IN()'

eid*_*lon 51 sql oracle syntax

我只是偶然发现了ORACLE SQL中的一些内容(不确定是否在其他内容中),我很好奇.我在这里要求作为维基,因为很难尝试在谷歌中搜索符号...

我刚刚发现,在根据一组值检查值时,您可以执行此操作

WHERE x = ANY (a, b, c)
Run Code Online (Sandbox Code Playgroud)

与通常相反

WHERE x IN (a, b, c)
Run Code Online (Sandbox Code Playgroud)

所以我很好奇,这两种语法的原因是什么?是一个标准和一个奇怪的Oracle语法?或者他们都是标准的?出于性能原因,是否有一个优先于另一个,或者?

只是好奇有人可以告诉我关于'= ANY'语法的内容.CheerZ!

Qua*_*noi 34

ANY(或其同义词SOME)是EXISTS具有简单相关性的语法糖:

SELECT  *
FROM    mytable
WHERE   x <= ANY
        (
        SELECT  y
        FROM    othertable
        )
Run Code Online (Sandbox Code Playgroud)

是相同的:

SELECT  *
FROM    mytable m
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    othertable o
        WHERE   m.x <= o.y
        )
Run Code Online (Sandbox Code Playgroud)

在非可空字段上具有相等条件,它变得类似于IN.

所有主要的数据库,包括SQL Server,MySQLPostgreSQL,支持该关键字.

  • @eidylon:`ANY`一找到第一个匹配的行就会返回.它是"EXISTS"的纯语法糖,并且以与"EXISTS"完全相同的方式进行优化.还有一个条件,`ALL`.`ANY`在第一个匹配的行上返回`TRUE`,`ALL`在第一个不匹配的行上返回`FALSE`. (2认同)

小智 19

IN- Equal to any member in the list
ANY- Compare value to **each** value returned by the subquery
ALL- Compare value to **EVERY** value returned by the subquery

<ANY() - less than maximum
>ANY() - more than minimum
=ANY() - equivalent to IN
>ALL() - more than the maximum
<ALL() - less than the minimum
Run Code Online (Sandbox Code Playgroud)

例如:

找到与每个部门的最低工资相同薪水的员工:

SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                 FROM employees
                 GROUP BY department_id);
Run Code Online (Sandbox Code Playgroud)

非IT程序员且薪水低于任何IT程序员的员工:

SELECT employee_id, last_name, salary, job_id
FROM employees
WHERE salary <ANY
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Run Code Online (Sandbox Code Playgroud)

薪水低于所有员工薪水的员工,其工作ID为IT_PROG且工作不是IT_PROG:

SELECT employee_id,last_name, salary,job_id
FROM employees
WHERE salary <ALL
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Run Code Online (Sandbox Code Playgroud)

....................

希望能帮助到你.-Noorin Fatima

  • “每个”和“每个”之间有什么区别? (2认同)

Cra*_*igH 16

简单地说一下,引用O'Reilly的"掌握Oracle SQL":

"在子查询中使用IN在功能上等同于使用ANY,如果在子查询返回的集合中找到匹配,则返回TRUE."

"我们认为你会同意IN比任何人更直观,这就是为什么IN几乎总是在这种情况下使用的原因."

希望能够解决你关于ANY和IN的问题.


Sea*_*ira 9

相信你要找的是这个:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298(Enddie Awad博客 上的链接)总结一下:

last_name IN ('SMITH', 'KING', 'JONES')

变成了

last_name = 'SMITH' OR last_name = 'KING' OR last_name = 'JONES'

salary > ANY (:first_sal, :second_sal)

变成了

salary > :first_sal OR salary > :second_sal

优化程序将使用ANY或SOME运算符后跟子查询的条件转换为包含EXISTS运算符和相关子查询的条件


eri*_*len 6

ANY语法允许您编写类似的东西

WHERE x > ANY(a, b, c)
Run Code Online (Sandbox Code Playgroud)

或事件

WHERE x > ANY(SELECT ... FROM ...)
Run Code Online (Sandbox Code Playgroud)

不确定这个星球上是否有人使用ANY(及其兄弟ALL).


Hog*_*gan 5

一个快速谷歌找到了这个http://theopensourcery.com/sqlanysomeall.htm

任何允许你使用除=以外的运算符,在大多数其他方面(空值的特殊情况)它的行为类似于IN.使用=运算符可以将IN视为ANY.