sql >> Databáze >  >> RDS >> Mysql

Potřebuji pomoc se správným SQL

Zkontrolujte pořadí priority mezi AND a OR.

V aritmetice má násobení vyšší prioritu než sčítání.

Příklad:10+10*10 =110, ale (10+10)*10 =200.

Podobné je to s AND a OR. AND má vyšší prioritu než OR, takže bez závorek:

WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1' 
  OR BookingInfo.ClinicID = '2'

funguje takto:

WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1') 
  OR BookingInfo.ClinicID = '2'

Ale chcete, aby to fungovalo takto:

WHERE BookingInfo.BookingDate = '05-18-2010' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')

Vložte tedy do závorek, abyste se ujistili, že pořadí priority funguje tak, jak chcete.

Také jsem si právě všiml, že používáte data ve formátu MM-DD-RRRR, který MySQL pro datové literály nerozpozná. Musíte použít formát RRRR-MM-DD. To může způsobovat jiný problém.

SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18

K vašemu komentáři:

Ano, jsem si jistý, že AND má vyšší prioritu než OR. Za prvé, hierarchie přednosti všech operátorů v MySQL je zdokumentována zde:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

Pojďme si projít příklad s použitím vašeho původně uvedeného problému:

BookingDate   ClinicID 
2010-05-18    2
2008-05-18    2

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'

Při použití tohoto výrazu by se měl shodovat pouze první řádek. Zjistili jste však, že se oba řádky shodují, i když datum druhého řádku není správné. Proč? Nahraďte každé srovnání buď PRAVDA, nebo NEPRAVDA:

TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE

Pokud by OR mělo vyšší prioritu, vyhodnotilo by se to takto:

TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)

Protože jakákoli hodnota kombinovaná s OR TRUE dává hodnotu TRUE, podvýraz v těchto závorkách by se zredukoval na:

TRUE AND (TRUE)
FALSE AND (TRUE)

A druhý řádek by se neshodoval, protože FALSE AND TRUE dává FALSE. Ale to nemůže být, protože jste našli druhý řádek nesprávně.

Ve skutečnosti má AND vyšší prioritu než OR, takže se skutečně vyhodnotí, jako byste měli kolem podvýrazu AND závorky:

(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE

Což se redukuje na:

(FALSE) OR TRUE
(FALSE) OR TRUE

V obou případech FALSE OR TRUE dává hodnotu TRUE a oba řádky se shodují.

Takže bez závorek je výchozí sémantika taková, že AND má vyšší prioritu než OR. Potřebujete závorky:

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')


  1. PostgreSQL:Který datový typ by měl být použit pro měnu?

  2. Připojte aplikace ODBC ve Windows k Zoho CRM

  3. Zend_Db_Select pořadí náhodně, kompatibilní v mssql / mysql

  4. Databáze, která zvládne více než 500 milionů řádků