Oracle兼容-语法-ANY/ALL


1. 语法

  1. expr comp_op ANY/ALL ( expr,expression_list )
  2. comp_op:
  3. =
  4. | !=
  5. | <>
  6. | <
  7. | >
  8. | <=
  9. | >=

2. 定义和用法

GreatSQL兼容支持 ANY/ALL 语法对多个表达式进行比较。

ANY/ALL 是采用等价转换方式来实现的。

operator转换
x = ANY(a,b,c)x IN(a,b,c)
x != ANY(a,b,c)x != a OR x != b OR x != c
x < ANY(a,b,c)x <= GREATEST(a,b,c)
x <= ANY(a,b,c)x <= GREATEST(a,b,c)
x > ANY(a,b,c)x > LEAST(a,b,c)
x >= ANY(a,b,c)x >= LEAST(a,b,c)
x = ALL(a,b,c)x = a AND x = b AND x= c
x != ALL(a,b,c)x NOT IN(a,b,c)
x < ALL(a,b,c)x < LEAST(a,b,c)
x <= ALL(a,b,c)x <= LEAST(a,b,c)
x > ALL(a,b,c)x > GREATEST(a,b,c)
x >= ALL(a,b,c)x >= GREATEST(a,b,c)

3. Oracle兼容说明

GreatSQL原生支持ROW类型的比较,因为 INNOT IN 支持表达式查找,所以= ANY!= ANY 也支持。

其他表达式和Oracle一致,都不支持。

4. 示例

  1. greatsql> CREATE TABLE t1 (
  2. uid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. name VARCHAR(50) NOT NULL,
  4. salary INT NOT NULL,
  5. deptno INT NOT NULL);
  6. greatsql> INSERT INTO t1(name, salary, deptno) VALUES ('John',5000,50),
  7. ('Jane',6000,50),
  8. ('Bob',7000,60),
  9. ('Sue',8000,70);
  10. greatsql> SELECT * FROM t1;
  11. +-----+------+--------+--------+
  12. | uid | name | salary | deptno |
  13. +-----+------+--------+--------+
  14. | 1 | John | 5000 | 50 |
  15. | 2 | Jane | 6000 | 50 |
  16. | 3 | Bob | 7000 | 60 |
  17. | 4 | Sue | 8000 | 70 |
  18. +-----+------+--------+--------+
  19. greatsql> SELECT * FROM t1 WHERE salary = ANY (5000, 6000, 7000);
  20. +-----+------+--------+--------+
  21. | uid | name | salary | deptno |
  22. +-----+------+--------+--------+
  23. | 1 | John | 5000 | 50 |
  24. | 2 | Jane | 6000 | 50 |
  25. | 3 | Bob | 7000 | 60 |
  26. +-----+------+--------+--------+
  27. greatsql> SELECT * FROM t1 WHERE salary = ALL (5000, 6000, 7000);
  28. Empty set (0.00 sec)
  29. greatsql> SELECT * FROM t1 WHERE salary != ALL (5000, 6000, 7000);
  30. +-----+------+--------+--------+
  31. | uid | name | salary | deptno |
  32. +-----+------+--------+--------+
  33. | 4 | Sue | 8000 | 70 |
  34. +-----+------+--------+--------+
  35. greatsql> SELECT * FROM t1 WHERE salary != ANY (5000, 6000, 7000);
  36. +-----+------+--------+--------+
  37. | uid | name | salary | deptno |
  38. +-----+------+--------+--------+
  39. | 1 | John | 5000 | 50 |
  40. | 2 | Jane | 6000 | 50 |
  41. | 3 | Bob | 7000 | 60 |
  42. | 4 | Sue | 8000 | 70 |
  43. +-----+------+--------+--------+
  44. greatsql> SELECT * FROM t1 WHERE salary < ALL (5000, 6000, 7000);
  45. Empty set (0.00 sec)
  46. greatsql> SELECT * FROM t1 WHERE salary < ANY (5000, 6000, 7000);
  47. +-----+------+--------+--------+
  48. | uid | name | salary | deptno |
  49. +-----+------+--------+--------+
  50. | 1 | John | 5000 | 50 |
  51. | 2 | Jane | 6000 | 50 |
  52. +-----+------+--------+--------+
  53. greatsql> SELECT * FROM t1 WHERE salary > ALL (5000, 6000, 7000);
  54. +-----+------+--------+--------+
  55. | uid | name | salary | deptno |
  56. +-----+------+--------+--------+
  57. | 4 | Sue | 8000 | 70 |
  58. +-----+------+--------+--------+
  59. greatsql> SELECT * FROM t1 WHERE salary > ANY (5000, 6000, 7000);
  60. +-----+------+--------+--------+
  61. | uid | name | salary | deptno |
  62. +-----+------+--------+--------+
  63. | 2 | Jane | 6000 | 50 |
  64. | 3 | Bob | 7000 | 60 |
  65. | 4 | Sue | 8000 | 70 |
  66. +-----+------+--------+--------+
  67. greatsql> SELECT * FROM t1 WHERE salary <= ALL (5000, 6000, 7000);
  68. +-----+------+--------+--------+
  69. | uid | name | salary | deptno |
  70. +-----+------+--------+--------+
  71. | 1 | John | 5000 | 50 |
  72. +-----+------+--------+--------+
  73. greatsql> SELECT * FROM t1 WHERE salary <= ANY (5000, 6000, 7000);
  74. +-----+------+--------+--------+
  75. | uid | name | salary | deptno |
  76. +-----+------+--------+--------+
  77. | 1 | John | 5000 | 50 |
  78. | 2 | Jane | 6000 | 50 |
  79. | 3 | Bob | 7000 | 60 |
  80. +-----+------+--------+--------+
  81. greatsql> SELECT * FROM t1 WHERE salary >= ALL (5000, 6000, 7000);
  82. +-----+------+--------+--------+
  83. | uid | name | salary | deptno |
  84. +-----+------+--------+--------+
  85. | 3 | Bob | 7000 | 60 |
  86. | 4 | Sue | 8000 | 70 |
  87. +-----+------+--------+--------+
  88. greatsql> SELECT * FROM t1 WHERE salary >= ANY (5000, 6000, 7000);
  89. +-----+------+--------+--------+
  90. | uid | name | salary | deptno |
  91. +-----+------+--------+--------+
  92. | 1 | John | 5000 | 50 |
  93. | 2 | Jane | 6000 | 50 |
  94. | 3 | Bob | 7000 | 60 |
  95. | 4 | Sue | 8000 | 70 |
  96. +-----+------+--------+--------+

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx