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
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!
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.
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
1
| SELECT SUBSTRING(col, 1, 10) AS test FROM table WHERE SUBSTRING(col, 1, 10) = "test"; |
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
Dat is dan in de categorie MySQL quirks, having hoort bij een group by.Guillome schreef op donderdag 10 juli 2008 @ 16:41:
Having werkt, bedankt!!
De normale oplossing is de substring hetzelfde gebruiken in je where.
Who is John Galt?
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:
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..
'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.
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.Kippenijzer schreef op donderdag 10 juli 2008 @ 16:39:
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)...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";
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.
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.
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}