sql >> Databasteknik >  >> RDS >> Sqlserver

MSSQL cast( [varcharColumn] till int) i SELECT exekveras innan WHERE-satsen filtrerar bort dåliga värden

För det första är detta inte ett "uppenbart designproblem". SQL är ett beskrivande språk för utdata, inte ett procedurspråk som specificerar hur bearbetning görs. Det finns ingen garanti för bearbetningsordningen i allmänhet, och detta är en fördel. Jag kan säga att det finns ett designproblem, men det handlar om den allmänna hanteringen av undantag i SQL-satser.

Enligt SQL Server-dokumentationen (http://msdn.microsoft.com/en-us/library/ms181765.aspx) kan du lita på evalueringsordningen för en CASE-sats för skalära uttryck . Så följande borde fungera:

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

Eller för att komma närmare ett "int"-uttryck:

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)

Din kod gör åtminstone en explicit CAST. Den här situationen är mycket otäckare när rollbesättningarna är implicita (och det finns hundratals kolumner).



  1. Enkel grafsökningsalgoritm i SQL (PostgreSQL)

  2. Procedur för att ladda ner fil från en given url i Oracle 11g och spara den i kolumnen blobtyp

  3. Hur man kontrollerar Oracle-databasen för långvariga frågor

  4. Postgresql JDBC-tabellvärderade parametrar