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

Responder a