Por que alguns dos resultados da consulta SQL contendo certos alfabetos estão faltando?

Dec 15 2020

Eu tenho a seguinte tabela

Quando executo a consulta a seguir, ele deveria ter mostrado todos os nomes de instrutores contendo 's', mas não mostra. A consulta que escrevi:

SQL> SELECT instructor_name
  2  FROM instructor
  3  WHERE instructor_name LIKE '%s%';

O resultado é:

Qual é o problema aqui? Balbir Silakar e Saurav Pangeni também não deveriam aparecer no resultado?

Respostas

1 GMB Dec 15 2020 at 21:47

's'e 'S'são duas coisas diferentes se sua coluna tiver um agrupamento que diferencia maiúsculas de minúsculas.

Infelizmente, a Oracle não fornece uma versão do like(geralmente chamada ilikeem outros bancos de dados) que não diferencia maiúsculas de minúsculas .

Você poderia fazer:

where instructor_name like '%s%' or instructor_name like '%S%' 

Ou:

where lower(instructor_name) like '%s%' 

Ou você pode usar regexp_like(); é necessário um terceiro argumento que pode ser usado para tornar a pesquisa insensível a maiúsculas e minúsculas.

where regexp_like(instructor_name, 's', 'i')

Eu não ficaria surpreso se a regex fosse a opção mais rápida das três.

catfood Dec 15 2020 at 21:39

Seu banco de dados (por padrão, eu acho) diferencia maiúsculas de minúsculas, portanto, o mecanismo de correspondência LIKE diferencia maiúsculas de minúsculas. Esses nomes contêm um S maiúsculo.

Aqui está uma pergunta e resposta sobre como tornar a pesquisa sem distinção entre maiúsculas e minúsculas. Execute uma consulta semelhante a maiúsculas e minúsculas em um banco de dados SQL Server que diferencia maiúsculas de minúsculas

leftjoin Dec 15 2020 at 21:47

Para verificação que não diferencia maiúsculas de minúsculas, use regexp_like

where regexp_like(instructor_name , 's', 'i');
WilliamRobertson Dec 16 2020 at 05:16

Como outros mencionaram, s(chr (115)) e S(chr (83)) são duas coisas diferentes, e não há sem 'Balbir Silakar' ou 'Saurav Pangeni'.

Do Oracle 12.2 você pode usar

where instructor_name collate binary_ci like '%s%';

Você também pode ignorar acentos com

where instructor_name collate binary_ai like '%s%';