O ORDER BY 'exige' que uma coluna 'conhecida' seja indicada. Por isso
aquele abaixo. Uma truque para contornar isso é colocar o to_ascii() em
uma das colunas de retorno e criar um alias para ele, ordenando por este
último. Um dia o 'parser' irá 'entender' esse tipo de consulta. :)

Utilize o seguinte:
regression=# select * from a;
id |  name
----+---------
  1 | test
  2 | abcd
  3 | testing
(3 registros)

regression=# select * from b;
cod |  nome
-----+---------
   1 | adriano
   2 | vanessa
   3 | claudia
   4 | claudio
(4 registros)

regression=# (select id,to_ascii(name, 'latin1') as x from a) union
(select cod,to_ascii(nome, 'latin1') from b) order by x asc;
id |    x
----+---------
  2 | abcd
  1 | adriano
  3 | claudia
  4 | claudio
  1 | test
  3 | testing
  2 | vanessa
(7 registros)

regression=#

--
Euler Taveira de Oliveira




Olá Euler e pessoal.

Está quase funcionando :-) A dúvida continua em como deixar aparecendo, em ordem alfabética, com letras acentuadas ou não, os nomes dos serviços das duas tabelas. Coloquei a função "to_ascii" onde a palavra de busca está, já que é para transformar esta também. Caso coloque em qualquer outro lugar, retorna o erro mencionado anteriormente.

A busca inteira é esta mostrada abaixo. Como podem ver, é um "pouquinho" maior que a mostrada originalmente, pois contempla certos critérios de busca pedidos pelo cliente. Onde há a string 'aaa' é onde a palavra de busca deve (ou deveria) ficar:

(SELECT s.id_servico, s.nome_servico, s.descricao_resumida, 1 AS tipo FROM csi_servico s
WHERE (to_ascii(s.palavra_chave, 'LATIN1') ~* to_ascii('(^|[^a-zA-Z]+)aaa.*', 'LATIN1')
OR to_ascii(s.nome_servico, 'LATIN1') ~* to_ascii('(^|[^a-zA-Z]+)aaa.*', 'LATIN1')
OR to_ascii(s.descricao_resumida, 'LATIN1') ~* to_ascii('(^|[^a-zA-Z]+)aaa.*', 'LATIN1')
OR to_ascii(s.descricao_completa, 'LATIN1') ~* to_ascii('(^|[^a-zA-Z]+)aaa.*', 'LATIN1'))
AND ind_visivel_servico=1 AND ind_situacao=2)

UNION

(SELECT up.id_utilidade_publica, up.nome as nome_servico, NULL, 2 AS tipo
FROM csi_utilidade_publica up
WHERE to_ascii(up.nome, 'LATIN1') ILIKE '%aaa%')
ORDER BY nome_servico 

A saída ficou assim:

id_serviconome_servicodescricao_resumidatipo
38
AaaNULL
2
35
Aaa1NULL
2
1376
Sssssssaaa
1
1385
ÁáAa ÉeEe ÍiIi ÓoOo ÚuUu
AaaEeeIiiOooUuu
adasdas
1
39
ÉeeaaaNULL
2



Mais alguma
---
Roni Warken
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
http://www.postgresql.org.br

Responder a