sql >> Databáze >  >> RDS >> Sqlserver

Přetypování MSSQL ([varcharColumn] na int) v SELECT se provede předtím, než klauzule WHERE odfiltruje špatné hodnoty

Zaprvé, nejde o „křiklavý designový problém“. SQL je popisný jazyk výstupu, nikoli procedurální jazyk, který určuje, jak se provádí zpracování. Obecně neexistuje žádná záruka na pořadí zpracování a to je výhoda. Mohl bych říci, že existuje problém s návrhem, ale týká se obecného zacházení s výjimkami v příkazech SQL.

Podle dokumentace k SQL Serveru (http://msdn.microsoft.com/en-us/library/ms181765.aspx) se můžete spolehnout na pořadí evauace pro příkaz CASE pro skalární výrazy . Mělo by tedy fungovat následující:

select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)

Nebo, abychom se přiblížili výrazu "int":

select (case when isnumeric(c.varcharColumn) = 1 and c.varcharColumn not like '%.%' and c.varcharColumn not like '%e%'
             then cast(c.varcharColumn as int)
        end)

Váš kód alespoň provádí explicitní CAST. Tato situace je mnohem horší, když jsou přetypování implicitní (a existují stovky sloupců).



  1. jak mohu vytvořit značkovací systém pomocí php a mysql?

  2. Jak provedu vyhledávání rozlišující malá a velká písmena pomocí LIKE?

  3. Docker php:5.6-Apache Development Environment chybí oprávnění pro připojení svazku

  4. Psql seznam všech tabulek