Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL] select .. as .. where probleem

Pagina: 1
Acties:

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Hai!

code:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table WHERE test = "test";


Hoe kan ik dit werkend krijgen? Hij kan de colom test niet vinden, logisch, die bestaat ook niet. Hij moet dan kijken naar die AS variabele.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
Gebruik having:

SQL:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table HAVING test = "test";

What do you mean I have no life? I am a gamer, I got millions!


  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 08:57

Kippenijzer

McFallafel, nu met paardevlees

where SUBSTRING(col, 1, 10) = "test"?

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

Welke database server gebruik je? Gebruik je MySQL of Microsoft SQL Server en welke versie. Wat jij aangeeft zou in Microsoft SQL moeten werken (zeker in 2005).

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • Guillome
  • Registratie: Januari 2001
  • Niet online
in ons geval is het veel langer, dus niet mooi. Ik kijk even naar having, snelle reacties :D
edit: mysql

[ Voor 6% gewijzigd door Guillome op 10-07-2008 16:40 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Verwijderd

Omdat de kolom test voor de where nog niet beschikbaar is. Dus moet je het gedeelte van de substring gebruiken. Dus:

code:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table WHERE SUBSTRING(col, 1, 10) = "test";

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Having werkt, bedankt!!
SQL:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table HAVING test = "test";

[ Voor 65% gewijzigd door Guillome op 10-07-2008 16:42 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dat is dan in de categorie MySQL quirks, having hoort bij een group by.
De normale oplossing is de substring hetzelfde gebruiken in je where.

Who is John Galt?


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Volgens de SQL92 specificatie moeten aliassen ook gebruikt kunnen worden in de where, group by en order by clausules.

De SQL query parser behoort namelijk de aliassen met hun daadwerkelijke statements te vervangen. MySQL behoort jouw query volgens de standaard automatisch om te schrijven naar:
SQL:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table WHERE SUBSTRING(col, 1, 10) = "test";

If it isn't broken, fix it until it is..


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voor de gehele, precieze uitleg: zie de manual. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Kippenijzer schreef op donderdag 10 juli 2008 @ 16:39:
where SUBSTRING(col, 1, 10) = "test"?
Dat is nogal foutgevoelig... zodra de 10 in 12 verandert door gewijzigde specs loop je het enorme risico dat junior codeklopper X niet ziet dat ie het 2 keer moet wijzigen, en dan heb je ineens heel spannend undefined behaviour in je applicatie.

Professionele website nodig?


  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

Niemand_Anders schreef op donderdag 10 juli 2008 @ 16:52:
Volgens de SQL92 specificatie moeten aliassen ook gebruikt kunnen worden in de where, group by en order by clausules.

De SQL query parser behoort namelijk de aliassen met hun daadwerkelijke statements te vervangen. MySQL behoort jouw query volgens de standaard automatisch om te schrijven naar:
SQL:
1
SELECT SUBSTRING(col, 1, 10) AS test FROM table WHERE SUBSTRING(col, 1, 10) = "test";
Exact. Dat is wat ik ook dacht. Ik gebruik ook vaak de aliassen voor order by statements enzo... Maar helaas worden de SQL specificaties niet helemaal lekker nageleefd in sommige implementaties (vandaar ook mijn vraag welke server hij gebruikte)...

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Ik gebruik regelmatig dit soort constructies, maar dan in situaties die iets complexer zijn. Je sql engine moet dan wel subqueries aankunnen:
SQL:
1
2
3
4
5
6
select t.test 
from (
    select substring(col, 1, 10) as test 
    from table 
) t
where t.test = "test"

Soort inline view zeg maar. Ik neem overigens aan dat er bij de berekening van het query plan er wel slim mee om wordt gegaan als er in de select en in de where dezelfde expressie gebruikt wordt. Maar redundantie moet je daar waar mogelijk voorkomen.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Tip: niet ervan uitgaan dat MySQL slim is :P SQL Server en Oracle hebben een goede query optimizer die dit soort dingen wel wegoptimaliseert, MySQL is een ramp.

Professionele website nodig?


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nou ja, je moet gewoon altijd de explain goed bekijken. Maar 9 vd 10 keer is een dergelijke derived table idioot veel sneller dan een subquery.

Maar hier zou ik geen derived table of truc tegen aangooien, aangezien het ook met een basic query kan. Als je die substring() call moe herhalen is dat idd jammer en foutgevoelig, maar iedere niet complete n00b ziet bij een dergelijk korte query wel dat de substrings bij elkaar horen, en anders gebruik je maar constanten of iets dergelijks.

En in dit geval kan de where clause overigens net zo goed col='test' zijn. :+

[ Voor 7% gewijzigd door Voutloos op 11-07-2008 10:17 ]

{signature}

Pagina: 1