sql >> Databáze >  >> RDS >> Oracle

Vyhodnocení zkratu CASE a COALESCE funguje se sekvencemi v PL/SQL, ale ne v SQL

Pro PL/SQL Oracle zajišťuje, že bude používat vyhodnocení zkratů:

Od:2 Základy jazyka PL/SQL

Když použijete nextval v kódu SQL máme jinou situaci.

Nejprve musíme mít na paměti, že currval a nextval jsou pseudosloupce:

Od:3 pseudosloupce .

Otázka nyní zní:proč Oracle hodnotí nextval ? nebo Je toto chování někde uvedeno?

From:Sequence Pseudocolumns

Váš případ je jasně "1. Příkaz SELECT nejvyšší úrovně", ale to neznamená, že není na místě logika zkratu, ale pouze nextval se vždy vyhodnocuje.

Pokud vás zajímá logika zkratu, pak je lepší odstranit nextval z rovnice.

Dotaz, jako je tento, nevyhodnocuje poddotaz:

select 6 c
  from dual
where  'a' = 'a' or 'a' = (select dummy from dual) 

Ale pokud se pokusíte udělat něco podobného s coalesce nebo case uvidíme, že se Oracle Optimizer rozhodne provést dílčí dotazy:

select 6 c
  from dual
where  'a' = coalesce('a', (select dummy from dual) )

Vytvořil jsem komentované testy v této ukázce v SQLFiddle to ukázat.

Vypadá to, že Oracle aplikuje logiku zkratu pouze v případě, že s podmínkou OR, ale s coalesce a case musí vyhodnotit všechny větve.

Myslím, že vaše první testy v PL/SQL ukazují, že coalsce a case použijte logiku zkratu v PL/SQL, jak uvádí Oracle. Váš druhý test, včetně sekvence v příkazech SQL, ukazuje, že v tomto případě nextval se stejně vyhodnotí, i když se výsledek nepoužije, a Oracle to také dokumentuje.

Spojení těchto dvou věcí vypadá trochu divně, protože coalsce a case chování se mi také zdá být opravdu nekonzistentní, ale musíme mít také na paměti, že implementace této logiky je závislá na implementaci (zde můj zdroj )



  1. Připojit dotaz pouze se sloupci, které mají všechny hodnoty v klauzuli `in`

  2. Jaké jsou osvědčené postupy pro použití GUID jako primárního klíče, konkrétně pokud jde o výkon?

  3. Jak používat JDBC k připojení databáze MySql

  4. Počítejte řádky v databázi mysql, kde časové razítko v intervalu X