Em 28 de novembro de 2012 15:40, Anselmo Silva <[email protected]> escreveu: >> >> > gostaria de um retorno boolean para >> >> > >> >> > SELECT A=B=C=D=E=F=G=H.... é possível numa só declaração SQL sem sem >> >> > saber o >> >> > numero de elementos? >> >> > >> >> Seja mais específico... Qual o tipo dos elementos? Quem fornecerá esses >> >> elementos? Você montará esta consulta dinamicamente em uma linguagem de >> >> programação? >> >> >> >> world=# SELECT (1 = 2) and (1 <> 3); >> >> ?column? >> >> ────────── >> >> f >> >> (1 registro) >> >> >> > >> > Os elementos são NUMERIC, os elementos são campos de uma tabela e a >> > consulta >> > não é dinâmica. Quero saber se são todos iguais então teorizei o select >> > acima citado. >> > Eu posso usar sua abordagem, apenas teorizei se era possível outra >> > abordagem >> > apenas com operadores '=', já que é 'humanamente' lógico pois qualque >> > elemento diferente retornaria Falso. >> >> >> AFAICS, não faz parte da linguagem SQL esta sintaxe, entretanto o >> operador '=' recebe dois parametros >> o 'esquerda' e o 'direita', e o PostgreSQL converte isto para algo >> como pg_catalog.equal(direita, esquerda) >> o que acaba impossibilitando esta sintaxe também para o operador '=' >> >> Mas voce pode fazer de outra maneira... >> >> postgres=# select a = ALL(ARRAY[a,b,c]) from (SELECT 1 as a, 2 as b, >> 3 as c, 1) as x; >> ?column? >> ---------- >> f >> (1 row) >> >> >> postgres=# select a = ALL(ARRAY[a,b,c]) from (SELECT 1 as a, 1 as b, >> 1 as c, 1) as x; >> ?column? >> ---------- >> t >> (1 row) >> > > A função all realmente resolve e bem é limpa. apenas comentando a resposta > do Dickson: > > Acha que seria algo interessante a se implementar? Visto que, como posso > fazer SELECT A+B+C+D+ETC... > seria um Ctrl+C e Ctrl+V no operador de soma (grosseiramente falando hehe).
Você pode fazer operadores especiais, veja que ao fazer select 1=2=3; ERROR: operator does not exist: integer = boolean LINE 1: select 1=2=3; O erro que dá é porque a saída de uma expressão, que no caso é booleana, é passada para a entrada da outra expressão, e neste caso não tem como comparar um boolean de uma expressão (1=2 que retorna false) com o inteiro da outra ( false = 3 por exemplo). Já no caso do + isto funciona porque as somas podem ser concatenadas. No caso da soma ficaria select 1+2+3; é expandido para algo como (o nome 'plus' é hipotético): SELECT plus(plus(1,2),3) Já este: SELECT 1+2+3; seria expandido para algo como (o nome 'plus' é hipotético): SELECT equal(equal(1,2), 3); porém equal(x, y) retorna boolean, mas x e y precisam ser integer. Você pode criar um operador que espera (boolean, integer) mas isto não resolveria o seu caso. Talvez um tipo composto. Basicamente seria isto. []s -- Dickson S. Guedes mail/xmpp: [email protected] - skype: guediz http://guedesoft.net - http://www.postgresql.org.br _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
