这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

谓词

谓词为事实测试。如果谓词测试为 true,则返回一个值。按行对每个谓词进行求值,因此当谓词是完整表 SELECT 语句的一部分时,该语句可以返回多个结果。

谓词由一组参数和实参组成。例如,在以下示例 WHERE 子句中:

WHERE name = 'Smith';
  • name = 'Smith' 为谓词

  • 'Smith' 为表达式

1 - BETWEEN 谓词

为方便使用,提供特殊的 BETWEEN 谓词。

语法

WHERE a BETWEEN x AND y

示例

WHERE a BETWEEN x AND y 

等效于:

WHERE a >= x AND a <= y

同样:

WHERE a NOT BETWEEN x AND y

等效于:

WHERE a < x OR a > y

可以为日期范围使用 BETWEEN 谓词:

=> CREATE TABLE t1 (c1 INT, c2 INT, c3 DATE);
=> COPY t1 FROM stdin DELIMITER '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1 | 2 | 2014-07-26
>> 2 | 3 | 2014-07-27
>> 3 | 4 | 2014-07-28
>> 4 | 5 | 2014-07-29
>> 5 | 6 | 2014-07-30
>> 6 | 7 | 2014-07-31
>> 7 | 8 | 2014-08-01
>> 8 | 9 | 2014-08-02
>> \.

=> SELECT* FROM t1 WHERE c3 BETWEEN DATE('2014-07-26') AND DATE('2014-07-30');
 c1 | c2 |     c3
----+----+------------
  1 |  2 | 2014-07-26
  2 |  3 | 2014-07-27
  3 |  4 | 2014-07-28
  4 |  5 | 2014-07-29
  5 |  6 | 2014-07-30
(5 rows)

也可以使用 NOW 和 INTERVAL 关键字从日期范围中选择:

=> SELECT * FROM t1 WHERE c3 BETWEEN NOW()-INTERVAL '1 week' AND NOW();
 c1 | c2 |     c3
----+----+------------
  7 |  8 | 2014-08-01
  1 |  2 | 2014-07-26
  2 |  3 | 2014-07-27
  3 |  4 | 2014-07-28
  4 |  5 | 2014-07-29
  5 |  6 | 2014-07-30
  6 |  7 | 2014-07-31
(7 rows)

2 - 布尔谓词

检索表达式的值为 true、false 或 unknown (null) 的行。

语法

expression IS [NOT] TRUE
expression IS [NOT] FALSE
expression IS [NOT] UNKNOWN

注意

  • 一个 null 输入被视为值 UNKNOWN

  • IS UNKNOWNIS NOT UNKNOWN 实际上与 NULL 谓词 相同,不过输入表达式不必是单个列值。要检查 NULL 的单个列值,使用 NULL 谓词。

  • 不要将布尔谓词与 布尔运算符布尔数据类型相混淆,后者只有两个值:true 和 false。

3 - 列值谓词

语法

column-name comparison-op constant-expression

参数

注意

要检查某一列值是否是 NULL,请使用 NULL 谓词

示例

table.column1 = 2
table.column2 = 'Seafood'
table.column3 IS NULL

4 - IN 谓词

语法

(column‑list) [ NOT ] IN ( values‑list )

参数

示例

以下 SELECT 语句可查询表 t11 中的所有数据。

=> SELECT * FROM t11 ORDER BY pk;
 pk | col1 | col2 | SKIP_ME_FLAG
----+------+------+--------------
  1 |    2 |    3 | t
  2 |    3 |    4 | t
  3 |    4 |    5 | f
  4 |    5 |    6 | f
  5 |    6 |    7 | t
  6 |      |    8 | f
  7 |    8 |      | t
(7 rows)

以下查询可指定 IN 谓词,以查找 t11 中的所有行,其中 col1col2 列包含 (2,3)(6,7) 的值:


=> SELECT * FROM t11 WHERE (col1, col2) IN ((2,3), (6,7)) ORDER BY pk;
 pk | col1 | col2 | SKIP_ME_FLAG
----+------+------+--------------
  1 |    2 |    3 | t
  5 |    6 |    7 | t
(2 rows)

5 - INTERPOLATE

使用某些有序属性将两个 事件序列联接在一起,通过联接事件序列,您可以直接比较两个序列的值,而不是将这些序列都标准化为相同的度量间隔。

语法

expression1 INTERPOLATE PREVIOUS VALUE expression2

参数

描述

  • 事件序列联接是常规外联接的扩展。事件序列联接不会在找不到匹配时用 NULL 值填充非保留侧,而是用表中的前一个值填充非保留侧。

  • 常规外联接与事件序列联接表达式的不同之处在于 ON 子句中使用的 INTERPOLATE 谓词。请参阅“注释和限制”下方的示例 部分。另请参阅 事件序列联接

  • 根据其他 ON 子句等同谓词将表中数据按照逻辑分区。

  • 插值来源于包含 null 值的表,而不是其他表。

  • Vertica 无法保证输出中不存在 null 值。如果不匹配行之前没有值,则用 null 填充该行。

  • 事件序列联接需要两个表的列均按照等同谓词以任何顺序进行排序,然后接 INTERPOLATED 列。如果数据已经按照这个顺序排序,则可以避免显式排序,从而提升查询性能。例如,给定下表:

    ask: exchange, stock, ts, pricebid: exchange,
    stock, ts, price
    

    在接下来的查询中

    • askexchange, stock 排序(或相反), ts

    • bidexchange, stock 排序(或相反), ts

    SELECT ask.price - bid.price, ask.ts, ask.stock, ask.exchange
    FROM ask FULL OUTER JOIN bid
       ON ask.stock = bid.stock AND ask.exchange =
       bid.exchange AND ask.ts INTERPOLATE PREVIOUS
       VALUE bid.ts;
    

限制

  • 每个联接仅可使用 INTERPOLATE 表达式一次。

  • INTERPOLATE 表达式仅使用 ANSI SQL-99 语法 (ON 子句),其支持全外联接。

  • INTERPOLATE 仅可使用等同谓词。

  • 支持 AND 运算符,但不支持 OR 和 NOT 运算符。

  • 不支持表达式以及隐式转换和显式转换,但可以使用子查询。

示例

接下来的示例中使用了此简单架构。

CREATE TABLE t(x TIME);
CREATE TABLE t1(y TIME);
INSERT INTO t VALUES('12:40:23');
INSERT INTO t VALUES('14:40:25');
INSERT INTO t VALUES('14:45:00');
INSERT INTO t VALUES('14:49:55');
INSERT INTO t1 VALUES('12:40:23');
INSERT INTO t1 VALUES('14:00:00');
COMMIT;

常规全外联接

=> SELECT * FROM t FULL OUTER JOIN t1 ON t.x = t1.y;

请注意来自非保留表的 null 行。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 |
 14:45:00 |
 14:49:55 |
          | 14:00:00
(5 rows)

带插值的全外联接

=> SELECT * FROM t FULL OUTER JOIN t1 ON t.x INTERPOLATE
PREVIOUS VALUE t1.y;

在本例中,没有入口点的行用前一行的值进行填充。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 12:40:23 | 14:00:00
 14:40:25 | 14:00:00
 14:45:00 | 14:00:00
 14:49:55 | 14:00:00
(5 rows)

常规左外联接

=> SELECT * FROM t LEFT OUTER JOIN t1 ON t.x = t1.y;

同样,非保留表中有 null

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 |
 14:45:00 |
 14:49:55 |
(4 rows)

带插值的左外联接

=> SELECT * FROM t LEFT OUTER JOIN t1 ON t.x INTERPOLATE
   PREVIOUS VALUE t1.y;

用插值填充 null。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 | 14:00:00
 14:45:00 | 14:00:00
 14:49:55 | 14:00:00
(4 rows)

内联接

对于内联接,常规内联接与事件序列内联接没有差别。因为结果集中没有 null 值,所以无需插值操作。

常规内联接仅返回唯一匹配行 12:40:23:

=> SELECT * FROM t INNER JOIN t1 ON t.x = t1.y;
    x     |    y
----------+----------
 12:40:23 | 12:40:23
(1 row)

事件序列内联接也找到了相同的唯一匹配行 12:40:23:

=> SELECT * FROM t INNER JOIN t1 ON t.x INTERPOLATE
PREVIOUS VALUE t1.y;
    x     |    y
----------+----------
 12:40:23 | 12:40:23
(1 row)

语义

如果要编写事件序列联接以取代常规联连,则按下列方式来评估值(使用上述示例中的架构):

  • t 是外部保留表

  • t1 是内部非保留表

  • 对于外部表 t 中的每一行,针对内部表 t1 中每一行的每个组合来评估 ON 子句谓词。

  • 如果针对任意的行组合的 ON 子句谓词评估为真,则在输出中生成组合行。

  • 如果针对所有组合的 ON 子句为假,则生成一个单独的输出行,其中包含t 中行的值,以及 t1 中的列,其选自 t1 中具有最大 t1.y 值的行,以使得 t1.y < t.x;如果没有找到这样的行,则用 null 填充。

在全外联接的情况下,两个表中的所有值都被保留。

另请参阅

6 - 联接谓词

指定联接两个或两个以上表中的记录的列。您可以使用逻辑运算符 ANDORNOT 连接多个联接谓词。

语法

ON column-ref = column-ref [ {AND | OR | NOT } column-ref = column-ref ]...

参数

7 - LIKE 谓词

当某列的字符串值与指定模式匹配时,检索该行。该模式可能包括一个或多个通配符 (*)。

语法

string‑expression [ NOT ] { LIKE | ILIKE | LIKEB | ILIKEB } 'pattern' [ESCAPE 'escape‑character' ]

参数

替换符号

可将以下符号替换为 LIKE 及其变体:

模式匹配

LIKE 要求整个字符串表达式与 patten 匹配。要与字符串中的任意一序列字符匹配, patten 开头和结尾必须使用百分比符号。

LIKE 不会忽略尾部空格字符。如果要匹配的数据值以不确定量的空格结尾,请将通配符 % 附加到 pattern

LIKE 变体比较

LIKE 谓词符合 SQL 标准。Vertica 还支持多种非标准变体,特别是 ILIKE,该变体等同于 LIKE,但可执行不区分大小写的搜索。以下差异与 LIKE 及其变体有关:

  • LIKE 对 UTF-8 字符字符串执行操作。精确行为取决于排序规则参数,如强度。特殊情况下,ILIKE 在当前会话语言环境下设置 S=2 (不计大小写)。

  • LIKEILIKE 对字符字符串 稳定,但对二进制字符串 不可变,而 LIKEBILIKEB 在两种情况下都不可变。

  • LIKEBILIKEB 谓词挨个字节进行 ASCII 比较。

区域设置依赖关系

默认语言环境设置下,LIKEILIKE 挨个 UTF-8 字符进行比较,比较不区分语言环境设置。 ILIKE 将独立语言转换为小写。

在非默认区域设置下,LIKEILIKE 将字符串做对比,区分语言环境设置,包括为 VARCHAR 类型使用与 "=" 相同的算法进行自动标准化。

ESCAPE 对于非默认语言环境设置,表达式的求值结果恰好为一个八位字节或一个 UTF-8 字符。

示例

以下示例显示了区域的模式匹配。

\locale default=> CREATE TABLE src(c1 VARCHAR(100));
=> INSERT INTO src VALUES (U&'\00DF'); --The sharp s (ß)
=> INSERT INTO src VALUES ('ss');
=> COMMIT;

默认区域下查询 src 表返回 ss 和 sharp s。

=> SELECT * FROM src;
 c1
----
 ß
 ss
(2 rows)

下列查询结合了参数匹配谓词来返回 c1 列的结果:

=> SELECT c1, c1 = 'ss' AS equality, c1 LIKE 'ss'
   AS LIKE, c1 ILIKE 'ss' AS ILIKE FROM src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | f        | f    | f
 ss | t        | t    | t
(2 rows)

下一个查询指定 c1 的 unicode 格式。

=> SELECT c1, c1 = U&'\00DF' AS equality,
   c1 LIKE U&'\00DF' AS LIKE,
   c1 ILIKE U&'\00DF' AS ILIKE from src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | t        | t    | t
 ss | f        | f    | f
(2 rows)

将区域改为德文,强度为 1(忽略大小写和口音):

\locale LDE_S1
=> SELECT c1, c1 = 'ss' AS equality,
c1 LIKE 'ss' as LIKE, c1 ILIKE 'ss' AS ILIKE from src;
 c1 | equality | LIKE | ILIKE
----+----------+------+-------
 ß  | t        | t    | t
 ss | t        | t    | t
(2 rows)

该例说明使用模式匹配谓词二进制数据类型:

=> CREATE TABLE t (c BINARY(1));
=> INSERT INTO t values(HEX_TO_BINARY('0x00'));
=> INSERT INTO t values(HEX_TO_BINARY('0xFF'));
=> SELECT TO_HEX(c) from t;
 TO_HEX
--------
 00
 ff
(2 rows)
select * from t;
  c
------
 \000
 \377
(2 rows)
=> SELECT c, c = '\000', c LIKE '\000', c ILIKE '\000' from t;
  c   | ?column? | ?column? | ?column?
------+----------+----------+----------
 \000 | t        | t        | t
 \377 | f        | f        | f
(2 rows)
=> SELECT c, c = '\377', c LIKE '\377', c ILIKE '\377' from t;
  c   | ?column? | ?column? | ?column?
------+----------+----------+----------
 \000 | f        | f        | f
 \377 | t        | t        | t
(2 rows)

8 - NULL 谓词

null 值测试。

语法

value_expression IS [ NOT ] NULL

参数

示例

列名称:

=> SELECT date_key FROM date_dimension WHERE date_key IS NOT NULL;
 date_key
----------
        1
      366
     1462
     1097
        2
        3
        6
        7
        8
...

函数:

=> SELECT MAX(household_id) IS NULL FROM customer_dimension;
 ?column?
----------
 f
(1 row)

字面量:

=> SELECT 'a' IS NOT NULL;
 ?column?
----------
 t
(1 row)