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_servico | nome_servico | descricao_resumida | tipo |
|---|---|---|---|
38 | Aaa | NULL | 2 |
35 | Aaa1 | NULL | 2 |
1376 | Sssssss | aaa | 1 |
1385 | ÁáAa ÉeEe ÍiIi ÓoOo ÚuUu AaaEeeIiiOooUuu | adasdas | 1 |
39 | Éeeaaa | NULL | 2
|
Mais alguma
---
Roni Warken
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil http://www.postgresql.org.br
