我有以下数据结构:
P_ID EVSSMIN EVSSMAX TDMIN TDMAX WARD SYRINGE_ID COMBINE_WITH CUSTOM_CONCENTRATION
1003 0 20 125 250 2ZKG 1021038
44444444 5
1003 20 60 125 250 2ZKG 1021037
44444444 5正常情况下,我使用以下查询作为结果。
查询1
SELECT *
FROM [definities]
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG' AND [P_ID]=` 1003;表中的最后一列可以包含大于0的值。上面是5。
通常,我想运行下面的查询,而不是上面的查询。
查询2
SELECT * FROM [definities]
WHERE 160 BETWEEN [TDMIN] AND [TDMAX]
AND CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX
AND [WARD] = '2ZKG' -- AND [P_ID]= 1003;正如您所看到的,查询通过将其除以CUSTOM_CONCENTRATION)值来计算值160。则它在EVVSMIN和EVSSMAX之间匹配,并且值160也在TDMIN和TDMAX之间匹配。通常,当CUSTOM_CONCENTRATION列包含大于0的值时,查询2将正常工作。
问题是,当CUSTOM_CONCENTRATION列不包含大于0的值时,查询就不能返回记录。这意味着必须修改查询,或者根据CUSTOM_CONCENTRATION值做一些修改。我可以在C#代码中解决这个问题,但更好的方法是通过查询来实现这一点,该查询根据值返回确切的记录,而不是需要迭代和使用if语句检查的多个记录。
发布于 2012-06-21 16:34:57
假设您希望在[CUSTOM_CONCENTRATION]值为零或更低时执行第一个查询,而在其他情况下执行第二个查询,则可以对这两个查询使用具有另一个限制的UNION ALL:
SELECT * FROM [definities]
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG' AND [P_ID]=` 1003
AND [CUSTOM_CONCENTRATION] <= 0
UNION ALL
SELECT * FROM [definities]
WHERE 160 BETWEEN [TDMIN] AND [TDMAX]
AND CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX
AND [WARD] = '2ZKG' -- AND [P_ID]= 1003
AND [CUSTOM_CONCENTRATION] > 0;另一种更优雅的解决方案是:
SELECT * FROM [definities]
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG'
AND (([P_ID]=` 1003
AND [CUSTOM_CONCENTRATION] <= 0)
OR
(CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX
AND AND [CUSTOM_CONCENTRATION] > 0));发布于 2012-06-21 16:38:09
可能是这样的:
SELECT * FROM [definities] WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND
( case when [CUSTOM_CONCENTRATION] = 0 then EVSSMIN
else CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) end
BETWEEN EVSSMIN AND EVSMAX )
AND [WARD] = '2ZKG'https://stackoverflow.com/questions/11134179
复制相似问题