Selecionar por atributos com base no intervalo de curingas SQL

8

Eu quero selecionar todos os registros de uma tabela de geodatabase onde a string começa com uma letra, então tentei

SELECT *
FROM tbl_names
WHERE "name" LIKE '[A-Z]%'

Isso não retornou registros. Após algumas pesquisas, descobri que essa é a sintaxe do SQL Server. Eu não achava que isso seria um problema, até onde eu sei todas as versões do suporte ao SQL %. Depois de examinar o arquivo de ajuda na criação de uma expressão de consulta , vi que a sintaxe correta é

SELECT *
FROM tbl_names
WHERE "name" >= 'A'

Como os nomes são todos cordas, meu primeiro instinto foi tentar LIKE. Por que o >=operador é usado em vez de LIKE? Os intervalos curinga não são suportados no ArcMap?

Cindy Jayakumar
fonte
Não conheço este banco de dados, mas de que lado ele classifica os dígitos? Ou seja, 0vem depois Z(o habitual, eu acho) ou antes A? Vários outros DBMSs não suportam esse tipo de funcionalidade; portanto, você precisa usar o conhecimento de coisas ligeiramente diferentes. Além disso, o que dizer dos caracteres minúsculos (ou tudo em maiúsculas)? E quanto aos caracteres que não são do inglês (não do AZ)?
Clockwork-Muse
Ao classificar um campo em ordem ascendente, cordas aparecer da seguinte forma: !z,?,0,0a,1,10,2,ant,A,Ant,z,Z. Então, caracteres especiais, dígitos e letras (diferenciam maiúsculas de minúsculas).
Cindy Jayakumar

Respostas:

9

Os curingas em geral são suportados pelo ArcMap. Aqui está um extrato da ajuda que você recebe enquanto faz um 'Selecionar por Atributos':


Use o operador LIKE (em vez do operador =) para criar uma pesquisa de seqüência parcial. Por exemplo, essa expressão selecionaria Mississippi e Missouri entre os nomes de estado dos EUA:

"STATE_NAME" LIKE 'Miss%'

Você pode usar operadores maior que (>), menor que (<), maior que ou igual (> =), menor que ou igual (<=) e BETWEEN para selecionar valores de sequência com base na ordem de classificação. Por exemplo, esta expressão selecionará todas as cidades em uma cobertura com nomes começando pelas letras M a Z:

"CITY_NAME" >= 'M' O <>operador not equal ( ) também pode ser usado ao consultar seqüências de caracteres.

Caracteres curinga Um caractere curinga é um símbolo especial que representa um ou mais caracteres.

Para qualquer dado baseado em arquivo, '%' significa que qualquer coisa é aceitável em seu lugar: um caractere, cem caracteres ou nenhum caractere. Como alternativa, se você deseja pesquisar com um curinga que represente um caractere, use '_'.

Por exemplo, essa expressão selecionaria qualquer nome começando com as letras Cath, como Cathy, Catherine e Catherine Smith:

"NAME" LIKE 'Cath%'

Mas essa expressão encontraria Catherine Smith e Katherine Smith:

"OWNER_NAME" LIKE '_atherine smith' Os curingas que você usa para consultar bancos de dados geográficos pessoais são '*' para qualquer número de caracteres e '?' para um personagem.

Caracteres curinga são exibidos como botões na caixa de diálogo de consulta. Você pode clicar no botão para inserir o curinga na expressão que está construindo. Apenas os caracteres curinga que são apropriados para a fonte de dados da camada ou tabela que você está consultando são exibidos.

Se você usar um caractere curinga em uma sequência com o operador =, o caractere será tratado como parte da sequência, não como curinga.

Com uma tabela unida, use curingas apropriados para o lado da união que você está consultando. Se a consulta se aplicar apenas aos campos na tabela de destino (a tabela do lado esquerdo), use os curingas da tabela de destino. Se a consulta se aplicar apenas a campos na tabela de junção (a tabela do lado direito), use os curingas da tabela de junção. Se a consulta envolver campos de ambos os lados da junção, use os curingas '%' e '_'.

Por exemplo, se você associar um arquivo dbf (a tabela de junção) a uma classe de recurso pessoal do GDB (a tabela de destino):

  1. Use * para consultas que envolvem apenas campos pessoais do GDB.

  2. Use% para consultas que envolvem apenas colunas dbf.

  3. Use% para consultas que envolvam colunas de ambos os lados da tabela.


De acordo com isso: acho que os intervalos não são suportados; você precisa usar> e <, do jeito que você fez.

Torsten
fonte
Entendo que curingas podem ser usados, como era o método que eu usava na maioria das vezes para selecionar substrings WHERE "name" LIKE '%substring%'. Somente quando precisei procurar uma sequência em um formato específico, como uma expressão regular no formulário [0-9][0-9][A-Z]%, percebi que ela não aceitaria intervalos curinga.
Cindy Jayakumar
Obrigado @Torsten! Eu nunca soube que, com o GDB pessoal, era usado * não% para caracteres curinga.
Brilhando
1

Sim, você pode usar curingas nas instruções LIKE. Nunca usei intervalos via ArcMap, mas você está usando a sintaxe correta do ponto de vista do SQL Server.

Uma rápida palavra de aviso se você for usar o operador '> ='. O resultado disso será diferente dependendo do agrupamento definido. Isso pode alterar a forma como a classificação é realizada nos dados, por exemplo, se diferencia maiúsculas de minúsculas ou não. Portanto, em alguns casos, sua consulta retornará apenas valores que começam com letras maiúsculas e, às vezes, maiúsculas e minúsculas.

Consulte http://sqlblog.com/blogs/louis_davidson/archive/2007/05/20/sorting-and-case-sensitive-collations.aspx .

Além disso, se você estiver interessado apenas no primeiro caractere do campo, poderá usar

WHERE SUBSTRING("name", 1, 1) >= 'A'

ao invés de

WHERE "name" >= 'A'

Isso pode ter benefícios de desempenho, se nada mais.

pecoanddeco
fonte
Na verdade, não, SUBSTRINGé improvável que o método aumente o desempenho, pois (geralmente) significa que quaisquer índices nameativados serão ignorados. Sim, você pode ter um custo mais alto para comparações (dados comprimentos de caracteres), mas a maioria das implementações que eu conheço retornaria após o primeiro caractere ser comparado de qualquer maneira ... duvido pessoalmente que qualquer otimizador seja escrito para perceber que SUBSTRING(column, 1, 1)está retornando apenas o início da cadeia de caracteres
Clockwork-Muse
Eu seria capaz de solucionar a distinção entre maiúsculas e minúsculas usando upper? No entanto, não estou preocupado com o caso deste exercício, mas seria bom ter em mente.
Cindy Jayakumar
Sim, você está absolutamente certo. É improvável que haja um benefício de desempenho ao usar SUBSTRING nesse caso e pode ter o efeito oposto.
Pecoanddeco