在WHERE子句中使用CASE到Calc单位

时间:2015-11-06 10:17:20

标签: sql sql-server

我正在使用SQL Sever 2014.以下查询执行没有问题。

USE [DRILLHOLES_Export] 
GO

SELECT TOP 100 
    [DHGeochemistryAttr].[Id]
    ,[DHGeochemistry].[SampleId]
    ,[DHGeochemistry].[FromDepth]
    ,[DHGeochemistry].[ToDepth]
    ,[DHGeochemistry].[Units]
    ,[DHGeochemistryAttr].[DHGeochemistryId]
    ,[DHGeochemistryAttr].[AttributeValue]
    ,[DHGeochemistryAttr].[MRTDetailId]
    ,[dbo].[MRTDetail].[Units]
FROM 
    [dbo].[DHGeochemistryattr]
INNER JOIN 
    [dbo].[MRTDetail] ON [dbo].[MRTDetail].[Id] = [DHGeochemistryAttr].[MRTDetailId]
INNER JOIN 
    [dbo].[DHGeochemistry] ON [dbo].[DHGeochemistryAttr].DHGeochemistryId] = [dbo].DHGeochemistry].[Id]
WHERE 
    [AttributeColumn] = 'Au' 
    AND ISNUMERIC([AttributeValue]) = 1 
    AND CAST([AttributeValue] AS FLOAT) > 1 
    AND [MRTDetail].[Units] = 'ppm'

[AttributeValue]列中的值可以是百万分率(ppm) 或十亿分之一(ppb)。 [MRTDetail].[Units]定义单位。

我希望查询报告所有高于1 ppm或1000 ppb的值;为此,我在CASE子句中尝试了以下WHERE语句:

WHERE 
    [AttributeColumn] = 'Au' 
    AND ISNUMERIC([AttributeValue]) = 1 
    AND 
       CASE [MRTDetail].[Units]
          WHEN 'PPM' 
             THEN CAST([AttributeValue] AS FLOAT)  > 1  
          WHEN 'PPB' 
             THEN CAST([AttributeValue] AS FLOAT) * 1000  > 1000
       END

我在第一个WHEN

上收到以下错误
  

Msg 102,Level 15,State 1,Line 70
  '>'附近的语法不正确。

有人可以帮忙吗? 问候, 彼得

4 个答案:

答案 0 :(得分:0)

如果你想做一个案例陈述。然后你可以做这样的事情:

(
        CASE [MRTDetail].[Units]
        WHEN 'PPM' THEN
            (
                CASE WHEN CAST([AttributeValue] AS FLOAT)  > 1 THEN 1 ELSE 0 END
            )
        WHEN 'PPB' THEN
            (
                CASE WHEN CAST([AttributeValue] AS FLOAT)*1000  > 1000 THEN 1 ELSE 0 END
            )
        END
)=1

答案 1 :(得分:0)

使用document.getElementById('pluginWrapper').pluginInit(); pluginInit(document.getElementById('pluginWrapper')); / AND代替:

OR

答案 2 :(得分:0)

改为使用AND / OR

WHERE [AttributeColumn] = 'Au' AND ISNUMERIC([AttributeValue]) = 1 AND 
 (([MRTDetail].[Units] = 'PPM' AND CAST([AttributeValue] AS FLOAT)  > 1)
  OR
  ([MRTDetail].[Units] = 'PPB' AND CAST([AttributeValue] AS FLOAT)*1000  > 1000))

或者也许:

WHERE [AttributeColumn] = 'Au' AND ISNUMERIC([AttributeValue]) = 1 AND 
 [MRTDetail].[Units] IN ('PPM','PPB) AND
 CAST([AttributeValue] AS FLOAT)  > 1.0

答案 3 :(得分:0)

请注意,我已经通过删除您在问题中的一些演员和验证来简化我的解决方案,以专注于CASE声明。

您可以执行以下操作:

WHERE   CASE Units
              WHEN 'PPM' THEN Value * 1000
              WHEN 'PPB' THEN Value
            END > 1000

Runnable样本:

CREATE TABLE #t
    (
      Units VARCHAR(10) ,
      Value FLOAT
    )
INSERT  INTO #t
VALUES  ( 'PPM', 1.01 ),  -- > 1000 ppb
        ( 'PPB', 25000 ), -- > 1000 ppb
        ( 'PPB', 950 ),   -- < 1000 ppb
        ( 'PPM', 0.79 )   -- < 1000 ppb

SELECT  *
FROM    #t
WHERE   CASE Units
          WHEN 'PPM' THEN Value * 1000
          WHEN 'PPB' THEN Value
        END > 1000

DROP TABLE #t

生成2行,小于1000 PPB:

Units   Value
PPM     1.01
PPB     25000