[SQL] Algemeen: Is `WHERE 1` een geldig SQL statement?

Pagina: 1
Acties:
  • 158 views sinds 30-01-2008
  • Reageer

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
Topicstarter
-

[ Voor 100% gewijzigd door Firefly III op 05-03-2016 15:10 . Reden: Leeg vanwege privacy. ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


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

TeeDee

CQB 241

Het zal best werken, maar "standaard" is dit niet correct imho.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Ik denk niet dat het standaard SQL is, in Oracle werkt het alleszins niet.

In dit geval wordt het gewoon aanzien als 'where true'. (Vergelijk het met volgend if statement:
code:
1
if( 1 )


Het is zowiezo beter en duidelijker als je die WHERE zo schrijft:
code:
1
WHERE 1 = 1

https://fgheysels.github.io/


  • MAZZA
  • Registratie: Januari 2000
  • Laatst online: 22-05 17:06

MAZZA

Barbie is er weer!


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Where is in proncipe een true of false statement. En 1 is true. En dus krijg je dan gewoon alles terug. En dus lijkt het juiste SQL.

Maar als iets werkt, wil dat nog niet zeggen dat het correct is. Ten eerste heeft het geen enkele toegevoegde waarde, ten tweede is de correcte syntax voor een where 'where veldnaam = waarde' (of is null of between). Where 1=1 zou dan nog beter zijn dan alleen where 1.

[ Voor 9% gewijzigd door OZ-Gump op 19-04-2004 11:18 ]

My personal website


  • Pathogen
  • Registratie: April 2004
  • Laatst online: 15:49

Pathogen

Shoop Da Whoop

phpMyAdmin gooit het ook altijd in zijn standaardqueries...
Wat OZ-Gump zegt klopt ook wel...
Het idee is waarschijnlijk dat die WHERE er staat zodat je netjes al je argumentjes meegeeft met je query.

Daarbij gebruik ik het nooit met '1', alleen maar als ik t nodig heb, ander kost het me weer toetsenbordslijtage ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

OZ-Gump schreef op 19 april 2004 @ 11:16:
Where is in proncipe een true of false statement. En 1 is true. En dus krijg je dan gewoon alles terug. En dus lijkt het juiste SQL.
Nee, 1 is een integer :)
En die kan weliswaar geconverteerd worden naar true, maar is niet hetzelfde als true.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
OZ-Gump schreef op 19 april 2004 @ 11:16:
Where is in proncipe een true of false statement. En 1 is true. En dus krijg je dan gewoon alles terug. En dus lijkt het juiste SQL.
'1' is niet true, 1 is een getal. Dit werkt dus niet in T-SQL:

DECLARE @foo int
SET @foo = 1

IF @foo
BEGIN
--bla
END

Je moet expliciet testen, en terecht. In VB is true gelijk aan -1 bv :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Ik kan me voorstellen dat het in T-SQL wel werkt als je van foo een BIT maakt. :+
maar dan is het eigenlijk hetzelfde doen als true a/e boolean assignen.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 19 april 2004 @ 11:44:
Ik kan me voorstellen dat het in T-SQL wel werkt als je van foo een BIT maakt. :+
maar dan is het eigenlijk hetzelfde doen als true a/e boolean assignen.
Nee :)

je krijgt een foutmelding

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

SQL Server 2000:
SQL:
1
2
use Northwind;
select * from Orders where true;

Geeft vriendelijk doch dringend:
code:
1
2
Server: Msg 170, Level 15, State 1, Line 2
Line 2: Incorrect syntax near ';'.

Ik had het hier vandeweek toevallig nog met een collega over, we vonden het ook een beetje vreemd daar dit gewoon een geldige boolean condition is. Maja, iemand zin om de ANSI-standards te spitten? :P

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
SQL Server kent het keyword 'true' niet.
In SQL Server heb je ook geen boolean velden; dat zijn daar BIT velden met die dus enkel 0 of 1 kan bevatten.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op 19 april 2004 @ 13:11:
SQL Server kent het keyword 'true' niet.
In SQL Server heb je ook geen boolean velden; dat zijn daar BIT velden met die dus enkel 0 of 1 kan bevatten.
Oh ja :X

Professionele website nodig?


Verwijderd

Oracle 8.1.7:
code:
1
2
3
4
5
6
7
8
SQL> select * from dual where 1;
select * from dual where 1
                         *
ERROR at line 1:
ORA-00920: invalid relational operator


SQL>

Raar dus. Kan het wel standaard ansi syntax zijn maar het is geen standaard sql syntax (SQL=structured Query Language, remember).

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
WHERE 1 is volgens de SQL standaard (ISO 9075:2003) geen geldig predicate. Een predicate moet een "condition that can be evaluated to give a boolean value" bevatten. Aangezien er in de standaard geen impliciete cast is van INTEGER naar BOOLEAN voldoet jouw predicate daar niet aan.

Sommige implementaties van de SQL standaard hebben andere casts tussen datatypes dan er in de standaard staan. Als er een cast is van integer naar boolean dan valt te verwachten dat jouw predicate wel werkt.
De titel zegt het eigenlijk al. SQL komt in vele soorten en maten, maar in MySQL en Access (welke vage SQL versie die ook gebruikt)
Het is grappig dat je MySQL en Access aanhaalt, en daarbij naar Access loopt te sneren. MySQL is namelijk in dit opzicht vele malen fouter dan Access. In MySQL heb je bijvoorbeeld een impliciete cast van '' (een lege string) naar 0. Dat zou betekenen dat in MySQL WHERE '' gecast zou moeten worden naar WHERE 0, wat vervolgens gecast zou moeten worden naar WHERE FALSE. Logisch toch? Of niet soms?

[ Voor 6% gewijzigd door jochemd op 19-04-2004 13:26 ]


  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
Topicstarter
-

[ Voor 100% gewijzigd door Firefly III op 05-03-2016 15:10 . Reden: Leeg vanwege privacy. ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Verwijderd

Slarioux schreef op 19 april 2004 @ 13:29:
Het was niet als sneer bedoelt, sorry. Een leraar van mij loopt er wel constant op te zeiken idd, die is helemaal oracle fan :).
En terecht natuurlijk ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

jochemd schreef op 19 april 2004 @ 13:25:
Het is grappig dat je MySQL en Access aanhaalt, en daarbij naar Access loopt te sneren. MySQL is namelijk in dit opzicht vele malen fouter dan Access. In MySQL heb je bijvoorbeeld een impliciete cast van '' (een lege string) naar 0. Dat zou betekenen dat in MySQL WHERE '' gecast zou moeten worden naar WHERE 0, wat vervolgens gecast zou moeten worden naar WHERE FALSE. Logisch toch? Of niet soms?
't Is wel precies wat PHP ook doet, dus dan is het wel logisch, aangezien ze zo vaak in combinatie gebruikt worden, moet je de gebruiker niet te veel in de war maken :+

't Is alleen wel weer raar dat '0' in MySQL waarsch ook naar false evalueert en dat dat in PHP juist naar true evalueert ;)

[ Voor 9% gewijzigd door ACM op 19-04-2004 13:38 ]


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
ACM schreef op 19 april 2004 @ 13:37:
[...]

't Is wel precies wat PHP ook doet, dus dan is het wel logisch, aangezien ze zo vaak in combinatie gebruikt worden, moet je de gebruiker niet te veel in de war maken :+

't Is alleen wel weer raar dat '0' in MySQL waarsch ook naar false evalueert en dat dat in PHP juist naar true evalueert ;)
Het hele probleem van MySQL is dat ze tegen elke prijs willen voorkomen dat de gebruiker een foutmelding krijgt. Ze hebben kennelijk niet begrepen dat foutmeldingen een feature zijn, ze vertellen je dat je iets fout hebt gedaan.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
jochemd schreef op 19 april 2004 @ 13:25:
WHERE 1 is volgens de SQL standaard (ISO 9075:2003) geen geldig predicate. Een predicate moet een "condition that can be evaluated to give a boolean value" bevatten. Aangezien er in de standaard geen impliciete cast is van INTEGER naar BOOLEAN voldoet jouw predicate daar niet aan.
Bij mijn weten heeft de SQL-92 standaard (sql-99 wel dacht ik) geen definitie voor 'boolean'. Het kent wel een expressie die true of false kan zijn, maar je kunt geen variable of field definieren van het type boolean.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
EfBe schreef op 19 april 2004 @ 15:06:

Bij mijn weten heeft de SQL-92 standaard
We zijn inmiddels al bij SQL:2003 aangeland.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
jochemd schreef op 19 april 2004 @ 17:09:
[...]
We zijn inmiddels al bij SQL:2003 aangeland.
Mja, maar dat is niet meer dan papiervulling. De meeste databases ondersteunen de SQL-92 standaard niet eens volledig.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

ACM schreef op 19 april 2004 @ 13:37:
't Is alleen wel weer raar dat '0' in MySQL waarsch ook naar false evalueert en dat dat in PHP juist naar true evalueert ;)
in PHP evalueert '0' ook naar false hoor ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1