我正在使用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
'>'附近的语法不正确。
有人可以帮忙吗? 问候, 彼得
答案 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