2017-08-15 46 views
1

我在Microsoft SQL Server中设置了一个视图。我展示的部分视图创建了一个名为Starch的列。我如何操纵case表达式中创建的列来判断它是高于还是低于2?已创建列的表达式

. 
.. 
... 
MAX(CASE WHEN R.ANALYTE = 'Starch' then 
(CASE WHEN ISNUMERIC(R.RN5) = 1 THEN CONVERT(float,R.RN5) ELSE convert(float,0) END) end) as [Starch], 

CASE 
WHEN Starch > 2 THEN 'ABOVE' 
ELSE 'Below' END 
As 'Starch_Cautionary', 
... 
.. 
. 
+0

小心使用'ISNUMERIC()'进行转换验证。什么版本的SQL Server?此外,样本数据和预期产出将有助于此。 – scsimon

+0

你想在同一个查询中使用创建的列Starch?或者是什么? –

+1

这与问题无关,但除了@scsimon评论SQL Server 2012及更高版本,您可以检查[TRY_CONVERT](https://docs.microsoft.com/en-us/sql/t-sql/functions/try-convert -transact-sql)函数来取代整个IF THEN ELSE部分 –

回答

1

假设你ISNUMERIC仍然不会导致转换错误(这可能取决于数据,即使= 1),那么你可以在其他的东西在CTE这个包起来。 ISNUMERIC()的

with cte as(
. 
.. 
... 
MAX(CASE WHEN R.ANALYTE = 'Starch' then 
(CASE WHEN ISNUMERIC(R.RN5) = 1 THEN CONVERT(float,R.RN5) ELSE convert(float,0) END) end) as [Starch], 
... 
.. 
.) 

select 
    *, 
    CASE 
    WHEN Starch > 2 THEN 'ABOVE' 
    ELSE 'Below' END 
    As 'Starch_Cautionary', 
... 
.. 
. 
from cte 

例失败...排序... ... ATLEAST对你的情况

declare @table table (i varchar(16)) 
insert into @table 
values 
('$'), 
('1e4'), 
('1,256,233'), 
('5D105') 

select isnumeric(i) from @table 

这些都返回true,但会失败的转换...