[PostgreSQL] Geselecteerde waarde met AS, gebruiken in WHERE

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Hi,

Ik zit al een tijdje met een probleem waar ik maar niet uitkomt. Ik wil een query maken (in postgresql), die een bepaalde waarde selecteert, om hem vervolgens te gebruiken in de WHERE clause. Nou weet ik dat MySQL dit wel aan kan, dus ik vroeg me af of Postgres het ook kan.

Om mijn verhaal even te verduidelijken met een code voorbeeld:
SQL:
1
2
3
4
5
SELECT
foo AS bar
FROM foo
WHERE
bar = 23


In dit voorbeeld zou ik natuurlijk ook kunnen zeggen, WHERE foo = 23, maar dat is het punt even niet, het gaat om het principe van een "AS variabelen" gebruiken in de WHERE.

Ik heb heb al lopen te zoeken op google, zoals : http://www.google.com/sea...lumn+in+where&btnG=Search . Maar ik ben er achtergekomen dat voor dit probleem zoekwoorden opstellen nogal lastig is :+

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Misschien dat je hier verder mee komt.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
volgens mij is het alias alleen bedoeld voor de output, en zul je overal in de query gewoon de volledige expressie moeten gebruiken.

Volgens de SQL standaard kan je een alias bijvoorbeeld ook niet in de ORDER BY clause gebruiken. Maar wat is de reden dat je dat wilt?

Edit:
En de google query van TeeDee levert volgens mij ook wel genoeg resultaten op om dat te verklaren ;)

[ Voor 17% gewijzigd door Woy op 29-04-2009 14:53 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Ah akkoord, na het lezen van een paar hits van de link van TeeDee begrijp ik inderdaad waarom het niet kan, helaas.

De reden dat ik het wilde, is omdat ik in mijn query een case heb staan, welke op het volgende neerkomt:
code:
1
2
3
4
5
6
a = 0;
if( foo ){
 a = calcAThisWay();
} else if( !foo ){
 a = calcAThatWay();
}


Verder in de query wil ik het resultaat van a gebruiken in de WHERE.
Als ik het alias had kunnen gebruiken, dan had ik later in de WHERE clause kunnen zeggen:
SQL:
1
2
3
4
...
AND a > b
AND a < c
AND a > 0

( Om maar een stom voorbeeld te noemen )

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Je zult of subselects moeten gebruiken of HAVING (al weet ik even niet zeker meer of HAVING wel werkt als je geen GROUP BY gebruikt)

Kijkend naar de structuur in de Oracle 10g SQL Reference is een HAVING ook te gebruiken zonder GROUP BY, ik weet alleen niet of dat ook op Postgres van toepassing zal zijn.
Werkt iig niet onder Oracle 10g

[ Voor 46% gewijzigd door Remus op 29-04-2009 15:19 ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

laat maar

[ Voor 89% gewijzigd door Zoijar op 29-04-2009 15:44 ]


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Ik heb gelezen wat subselects zijn (In principe komt het neer op subqueries). Maar dan nog zie ik niet in hoe ik subselects zou moeten gebruiken om te voorkomen dat ik zou moeten schrijven:

code:
1
2
3
AND (if( foo ){ calcAThisWay() > b} else if( !foo ){ calcAThatWay() > b} ) 
AND (if( foo ){ calcAThisWay() > c else if( !foo ){ calcAThatWay() < c} )
AND (if( foo ){  calcAThisWay() > 0 } else if( !foo ){ calcAThatWay() > 0} )



Let niet op het smerige, vast nergens compilerend stukje code/pseudo-sql, het gaat om het principe :+

[ Voor 3% gewijzigd door Enfer op 29-04-2009 15:46 ]


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Enfer schreef op woensdag 29 april 2009 @ 15:46:
Ik heb gelezen wat subselects zijn (In principe komt het neer op subqueries). Maar dan nog zie ik niet in hoe ik subselects zou moeten gebruiken om te voorkomen dat ik zou moeten schrijven:

code:
1
2
3
AND (if( foo ){ calcAThisWay() > b} else if( !foo ){ calcAThatWay() > b} ) 
AND (if( foo ){ calcAThisWay() > c else if( !foo ){ calcAThatWay() < c} )
AND (if( foo ){  calcAThisWay() > 0 } else if( !foo ){ calcAThatWay() > 0} )



Let niet op het smerige, vast nergens compilerend stukje code/pseudo-sql, het gaat om het principe :+
Misschien is subselect niet het juiste woord, maar ik bedoel iets als
SQL:
1
2
3
4
5
6
SELECT *
FROM (
  SELECT (je eigenlijke query)
  FROM iets
  WHERE voorwaarde)
WHERE gewenste filter-conditie

Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Remus schreef op donderdag 30 april 2009 @ 19:06:
[...]


Misschien is subselect niet het juiste woord, maar ik bedoel iets als
SQL:
1
2
3
4
5
6
SELECT *
FROM (
  SELECT (je eigenlijke query)
  FROM iets
  WHERE voorwaarde)
WHERE gewenste filter-conditie
Ik heb recentelijk hetzelfde probleem gehad met MySQL. De bovenstaande oplossing van Remus werkt iig, en hezelfde geldt voor HAVING (zie andere reactie van Remus), dus

SQL:
1
2
3
4
SELECT (je eigenlijke query), foo as bar
FROM iets
WHERE voorwaarde
HAVING bar = vol

Used to be Down Under... Foto gallery

Pagina: 1