How can I query 'between' numeric data on a not numeric field?

后端 未结 4 465
别那么骄傲
别那么骄傲 2021-01-18 04:25

I\'ve got a query that I\'ve just found in the database that is failing causing a report to fall over. The basic gist of the query:

Select *
From table
Wher         


        
4条回答
  •  隐瞒了意图╮
    2021-01-18 04:53

    You'd have to force SQL to evaluate the expressions in a certain order. Here is one solution

    Select *
    From ( TOP 2000000000
       Select *
       From table
       Where IsNumeric(myField) = 1
       And IsNull(myField, '') <> ''
       ORDER BY Key
    ) t0
    Where Convert(int, myField) Between @StartRange And @EndRange
    

    and another

    Select *
    From table
    Where
    
    CASE
       WHEN IsNumeric(myField) = 1 And IsNull(myField, '') <> ''
       THEN Convert(int, myField) ELSE @StartRange-1
    END Between @StartRange And @EndRange
    
    • The first technique is "intermediate materialisation": it forces a sort on a working table.
    • The 2nd relies on CASE ORDER evaluation is guaranteed
    • Neither is pretty or whizzy

    SQL is declarative: you tell the optimiser what you want, not how to do it. The tricks above force things to be done in a certain order.

提交回复
热议问题