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 e trim, 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 e trim:

Se você passar uma coluna com o especificador upper, lower ou trim para essas funções, ocorrerá um erro de compilação.

Após a mudança:

A função LIKE respeita os especificadores upper, lower e trim, 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 e trim.

  • 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');
Copy

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%';
Copy
+-------+-------+
| 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%';
Copy
+-------+-------+
| 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%';
Copy
+-------+-------+
| 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%';
Copy

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