Funções SQL: passagem de colunas que possuem o especificador de agrupamento upper
, lower
ou trim
(pendente)¶
Atenção
Essa mudança de comportamento está no pacote 2024_02.
Para saber o status atual do pacote, consulte Histórico do pacote.
Os especificadores de agrupamento upper
e lower
convertem cadeias de caracteres em maiúsculas ou minúsculas (respectivamente) antes de as cadeias de caracteres serem comparadas. O especificador de agrupamento trim
remove espaços iniciais e finais antes que as cadeias de caracteres sejam comparadas.
Nos casos em que você passa colunas com esses especificadores para algumas das funções SQL, o comportamento muda das seguintes maneiras:
- Antes da mudança:
A função LIKE ignora os especificadores
upper
,lower
etrim
, o que resulta em uma comparação que diferencia maiúsculas de minúsculas.Além disso, as funções a seguir não suportam colunas com os especificadores
upper
,lower
etrim
:Variantes da função LIKE:
Se você passar uma coluna com o especificador
upper
,lower
outrim
para essas funções, ocorrerá um erro de compilação.- Após a mudança:
A função LIKE respeita os especificadores
upper
,lower
etrim
, o que resulta em uma comparação que não diferencia maiúsculas de minúsculas.Como resultado, as consultas que usam a função LIKE podem retornar linhas adicionais (veja o exemplo abaixo).
Observe que a função LIKE não oferece suporte a combinações com especificadores de local (por exemplo,
en-upper
).Além disso, as funções a seguir agora oferecem suporte a colunas com os especificadores
upper
,lower
etrim
.Variantes da função LIKE:
LIKE ALL
LIKE ANY
ILIKE ANY
CONTAINS
ENDSWITH
POSITION
REPLACE
SPLIT
SPLIT_PART
STARTSWITH
Exemplo dos efeitos da mudança na função LIKE¶
Conforme observado acima, se uma coluna tiver o especificador upper
, lower
ou trim
, as consultas com a função LIKE poderão retornar linhas adicionais. Por exemplo, suponha que uma tabela tenha uma coluna com o especificador lower
. Suponha que o texto na tabela seja diferente em maiúsculas e minúsculas.
CREATE OR REPLACE TABLE collated_like (
col_a VARCHAR,
col_b VARCHAR COLLATE 'lower'
);
INSERT INTO collated_like VALUES ('abc', 'abc'), ('ABC','ABC');
Antes da mudança de comportamento, cada uma das consultas a seguir que usam a função LIKE retorna uma linha com o valor '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 |
+-------+-------+
Após a mudança de comportamento, a consulta que não usa a coluna de especificação lower
com a função LIKE ainda retorna uma linha:
SELECT * FROM collated_like WHERE col_a LIKE '%b%';
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc | abc |
+-------+-------+
No entanto, as consultas que usam a função COLLATE para especificar lower
e as consultas que passam uma coluna com a especificação lower
para a função LIKE retornam duas linhas:
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 |
+-------+-------+
Isso é aproximadamente equivalente a ILIKE. Para determinar se você deve esperar alterações nessas consultas, substitua LIKE por ILIKE nessas consultas.
Preservação do comportamento antes da mudança¶
Se suas colunas usarem a especificação upper
, lower
ou trim
e você deseja preservar o comportamento antes da alteração, você pode usar a função COLLATE com uma especificação vazia para indicar que a especificação upper
, lower
ou trim
associada à coluna não deve ser usada:
SELECT * FROM collated_like WHERE col_b COLLATE '' LIKE '%b%';
Nota
Se você estiver usando essa abordagem com a função LIKE, certifique-se de que tanto o assunto quanto o padrão não tenham uma especificação de ordenação aplicada.
Ref: 1535