SQL 函数:传入具有 upper
、lower
或 trim
排序规则说明符的列¶
upper
和 lower
:ref:` 排序规则说明符 <label-collation_specification>` 会在比较字符串之前,将字符串分别转换为大写或小写。trim
排序规则说明符在比较字符串之前,会移除前导空格和末尾空格。
在将带有这些说明符的列传传入某些 SQL 函数时,行为变更如下:
- 变更前:
LIKE 函数会忽略
upper
、lower
和trim
说明符,这会导致比较区分大小写。此外,以下函数不支持带有
upper
、lower
和trim
说明符的列:LIKE 函数的变体:
如果传入带有
upper
、lower
或trim
说明符的列,将发生编译错误。- 变更后:
LIKE 函数遵循
upper
、lower
和trim
说明符,这会导致比较不区分大小写。因此,使用 LIKE 函数的查询可能会返回额外的行(请参阅以下示例)。
请注意,LIKE 函数不支持与区域设置说明符组合(例如,
en-upper
)。此外,以下函数现在支持带有
upper
、lower
和trim
说明符的列:LIKE 函数的变体:
LIKE ALL
LIKE ANY
ILIKE ANY
CONTAINS
ENDSWITH
POSITION
REPLACE
SPLIT
SPLIT_PART
STARTSWITH
LIKE 函数变更的影响示例¶
如上所述,如果某个列具有 upper
、lower
或 trim
说明符,则使用 LIKE 函数的查询可能会返回额外的行。例如,假设某个表具有带 lower
说明符的列。假设表中的文字大小写不同。
CREATE OR REPLACE TABLE collated_like (
col_a VARCHAR,
col_b VARCHAR COLLATE 'lower'
);
INSERT INTO collated_like VALUES ('abc', 'abc'), ('ABC','ABC');
在行为变更之前,以下每个查询都使用 LIKE 函数返回一行,其值为 'abc'
:
SELECT * FROM collated_like WHERE col_a LIKE '%b%';
SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';
SELECT * FROM collated_like WHERE col_b LIKE '%b%';
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc | abc |
+-------+-------+
行为变更后,不使用 lower
规范列和 LIKE 函数的列将仍然返回一行:
SELECT * FROM collated_like WHERE col_a LIKE '%b%';
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc | abc |
+-------+-------+
但是,使用 COLLATE 函数指定 lower
的查询以及将带有 lower
规范的例如传入 LIKE 函数的查询将返回两行:
SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';
SELECT * FROM collated_like WHERE col_b LIKE '%b%';
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc | abc |
| ABC | ABC |
+-------+-------+
这大致相当于 ILIKE。要确定是否应预期这些查询的变更,可以在这些查询中将 LIKE 替换为 ILIKE。
保留变更前的行为¶
如果列使用 upper
、lower
或 trim
规范,并且您希望保留变更前的行为,则可以使用 COLLATE 函数和空规范,来指明不应使用与列相关的 upper
、lower
或 trim
规范:
SELECT * FROM collated_like WHERE col_b COLLATE '' LIKE '%b%';
备注
如果您将此方法与 LIKE 函数搭配使用,请确保主题和模式均未应用排序规则规范。
参考:1535