来自= ANY的句法糖吗?

问题描述 投票:0回答:3

1)据我所知,比较= ANY看起来与IN非常相似。是这样吗?例如:

SELECT * FROM HOUSES 
WHERE TYPE = ANY (SELECT TYPE FROM TYPES WHERE CAT_ID = 'PUBLIC')

它总是等于说吗?

SELECT * FROM HOUSES 
WHERE TYPE IN (SELECT TYPE FROM TYPES WHERE CAT_ID = 'PUBLIC')

2)Not IN怎么样?它等于<> ALL吗?我倾向于认为它是,但不能清楚地看到它。

sql
3个回答
3
投票

你是对的IN相当于= ANY。在这个主题上,SQL:2016标准(ISO 9075-2:2016)说:

8.4 <在谓词中>

[..]

Syntax Rules

[..]

4)表达

RVC NOT IN IPV

相当于

NOT ( RVC IN IPV )

5)表达

RVC IN IPV

相当于

RVC = ANY IPV

IN的等价在第5点,而第4点在某种程度上回答了你关于NOT IN的问题。


1
投票
  1. 是的,= ANY总是等于IN。 ANY在值上使用OR chosen = ANY('True', 'Yes') 扩展时: chosen = 'True' OR chosen = 'Yes' 与: chosen IN ('True', 'Yes') 扩展时: chosen = 'True' OR chosen = 'Yes' ANY / IN都使用OR
  2. 是的,NOT IN总是等于<> ALL。 ALL在值上使用AND chosen <> ALL ('Yes', 'True') 扩展时: chosen <> 'Yes' AND chosen <> 'True' 与: chosen NOT IN ('Yes', 'True') 与: NOT (chosen IN ('Yes', 'True')) 扩展时: NOT (chosen = 'Yes' OR chosen = 'True') 应用De Morgan定理: chosen <> 'Yes' AND chosen <> 'True' <> ALL / NOT IN都使用AND

我试图谷歌,如果有一个stackoverflow答案,可以让我解释“点击”。

在quora上找到了answer

注意,伪代码提前。查询不会开箱即用。为了使查询真正起作用,将列表封装为“Any”/“All”可以操作的内容,例如arrayvalues

“任何”:它相当于“OR”条件。因此,在下面的例子中考虑工资> 2000或3000或4000

SELECT empno, sal
FROM   emp
WHERE  sal > ANY (2000, 3000, 4000);

     EMPNO        SAL
---------- ----------
      7566       2975
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7902       3000

“全部”:相当于“和”条件。因此,在下面的例子中,考虑工资> 2000和3000和4000

SELECT empno, sal
FROM   emp
WHERE  sal > ALL (2000, 3000, 4000);

     EMPNO        SAL
---------- ----------
      7839       5000

样本数据:

| empno |  ename |       job |  mgr |             hiredate |  sal | comm | deptno |
|-------|--------|-----------|------|----------------------|------|------|--------|
|  7369 |  smith |     clerk | 7902 | 1980-12-17T00:00:00Z |  800 | null |     20 |
|  7499 |  allen |  salesman | 7698 | 1981-02-20T00:00:00Z | 1600 |  300 |      0 |
|  7521 |   ward |  salesman | 7698 | 1981-02-22T00:00:00Z | 1250 |  500 |     30 |
|  7566 |  jones |   manager | 7839 | 1981-04-02T00:00:00Z | 2975 | null |     20 |
|  7654 | martin |  salesman | 7698 | 1981-09-28T00:00:00Z | 1250 | 1400 |     30 |
|  7698 |  blake |   manager | 7839 | 1981-05-01T00:00:00Z | 2850 | null |     30 |
|  7782 |  clark |   manager | 7839 | 1981-06-09T00:00:00Z | 2450 | null |     10 |
|  7788 |  scott |   analyst | 7566 | 1987-04-19T00:00:00Z | 3000 | null |     20 |
|  7839 |   king | president | null | 1981-11-17T00:00:00Z | 5000 | null |     10 |
|  7844 | turner |  salesman | 7698 | 1981-09-08T00:00:00Z | 1500 |    0 |     30 |
|  7876 |  adams |     clerk | 7788 | 1987-05-23T00:00:00Z | 1100 | null |     20 |
|  7900 |  james |     clerk | 7698 | 1981-12-03T00:00:00Z |  950 | null |     30 |
|  7902 |   ford |   analyst | 7566 | 1981-12-03T00:00:00Z | 3000 | null |     20 |
|  7934 | miller |     clerk | 7782 | 1982-01-23T00:00:00Z | 1300 | null |     10 |

1
投票

我假设您的数据库支持ANY运算符(其他一些数据库不支持它)。使用ANY=后跟子查询在逻辑上等同于使用IN,然后使用相同的子查询。但不同的是,ANY也支持其他比较运算符>>=<<=

比较<> ALL说子查询中的每个记录都不等于LHS上的值。否定这一点是在子查询中存在一个或多个与LHS相等的记录。因此,与<> ALL相反的只是IN

© www.soinside.com 2019 - 2024. All rights reserved.