Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

MSSQL cast( [varcharColumn] to int) в SELECT се изпълнява преди клаузата WHERE да филтрира лоши стойности

Първо, това не е „явен проблем с дизайна“. SQL е описателен език на изхода, а не процедурен език, който указва как се извършва процесирането. По принцип няма гаранция за реда на обработка и това е предимство. Мога да кажа, че има проблем с дизайна, но той е около общата обработка на изключения в SQL изразите.

Според документацията на SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), можете да разчитате на реда на evauation за оператор CASE за скаларни изрази . И така, следното трябва да работи:

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

Или, за да се доближите до израз "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)

Поне вашият код прави изрично CAST. Тази ситуация е много по-неприятна, когато отливките са имплицитни (и има стотици колони).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изявлението за актуализация се изпълнява твърде дълго или не

  2. Как да заявите xml колона в tsql

  3. Когато не е посочено „Поръчай по“, какъв ред избира заявката за вашия набор от записи?

  4. SQL производителност:WHERE срещу WHERE(ROW_NUMBER)

  5. Планирайте SQL задание всеки ден в конфигурирани от потребителя времеви интервали