Como selecionar de uma tabela com um predicado de igualdade na point
coluna?
Para ser claro: é um point
tipo de dados nativo do Postgres, não geometry(point)
do PostGIS.
select a.* from indsolv.address As a where a.location = '93.2321, 21.0321';
Obtendo este erro para a consulta acima:
ERROR: operator does not exist: point = unknown LINE 1: ...ct a.* from indsolv.address As a where a.location = '93.2321... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. SQL state: 42883
Também tentei:
select a.* from indsolv.address As a where a.location = point('93.2321,21.0321');
Ainda recebendo um erro.
Por mais que tente, a resolução do tipo de operador não encontrará nenhum operador apropriado e desistirá da mensagem de erro que você relatou.
Adicionar um cast de tipo explícito (ou a
point()
função que obtém o mesmo) ao argumento correto, como você fez em sua segunda tentativa adicionada, só conseguirá tornar a mensagem de erro um pouco mais reveladora:A diferença sutil pode servir como dica: o problema não é uma conversão ausente (embora ser explícito sobre os tipos de dados nunca seja uma má ideia). O problema é que, de fato, não existe um operador de igualdade
=
definido para o tipo de dadopoint
. O manual:Para o tipo de dados ,
point
não existe=
. Veja você mesmo (testado no Postgres 12):A solução é usar o operador "mesmo que"
~=
apropriado . Funciona com ou sem conversão de tipo explícito, com ou sem incluir parênteses no literal de string e com a notação de função que você testou também - e, neste caso, com qualquer tipo de literal de string, bem como com dois parâmetros separados, pois há vários sobrecarregados versões dapoint()
função:Relacionado: