使用Case中的Where子句进行比较

时间:2018-10-24 12:53:34

标签: sql-server tsql sql-server-2008 case ssms

我是T-sql的新手。

我正在使用以下查询:

SELECT e.Id,e.cAvg,
CASE 
    WHEN e.cAvg<=0.8 and cAvg>=0 THEN t.Model when t.Cr='0.8' then t.Model 
    WHEN e.cAvg>0.8 and cAvg<=5.4 THEN t.Model WHEN t.Cr='5.4' then t.Model 
    WHEN e.cAvg>5.4 and cg<=8 THEN t.Model WHEN t.Cr='8' then t.Model 
    ELSE 'No Change Required'
  END
  from A e, B t;

我想做的是:

  • 在表A中选择id和cAvg列。
  • 比较表A中的cAvg和表B中的Cr。
  • 使用CASE中的比较来选择满足条件的特定行。
  • 使用选定的行提供查询结果。

t.Model是表B的一列。我想在case语句中选择所选行的t.Model值。

我觉得方法是在CASE的When中包含某种where子句。

需要方向!

表架构:

表A:

+----+------+
| id | cAvg |
+----+------+
|  1 | .8   |
|  2 | 5.4  |
|  3 | 6.0  |
+----+------+

表B:

+-----+-------+
| Cr  | Model |
+-----+-------+
| 2   | M1    |
| 5.5 | M2    |
| 8   | M3    |
+-----+-------+

我要执行以下操作:

  • 使用条件=>比较cAvg的值(cAvg <= 8并且cAvg> = 5.5 =>所选模型必须为M3。)

我想要得到的结果是:

+----+------+-------+
| id | cAvg | Model |
+----+------+-------+
|  1 | .8   | M1    |
|  2 | 5.4  | M2    |
|  3 | 6.0  | M3    |
+----+------+-------+

我很累,按照评论中的建议加入,非常感谢,因为它,我学到了很多东西!!

我的问题是没有要连接的公共列。 另外,我需要将一个表中的列与另一张表中的列进行比较,然后根据比较结果得出结果。

我在堆栈溢出中提到了很多答案,但是所有答案都是在有共同列的前提下进行的。

我尝试了以下操作:

  • 内部加入
  • 案例

我需要一个方向说明。 谢谢!!

2 个答案:

答案 0 :(得分:1)

首先,您从2个表中进行选择,但没有任何链接限制,因此将比较所有行

如果表之间存在匹配键,那么将仅在JOIN语句中使用相关的行对进行比较:

def read_img_and_mat(path):
    image_string = tf.read_file(path)
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    label = ... # get label from mat file
    return image_decoded, label

第二,为了选择相关的行,您应该确定它们是什么。 您可以在WHERE语句中定义什么是未解决的案件

A e JOIN B t ON e.id = t.id

您可以在WHERE中使用case语句,但是应将结果设为TRUE

WHERE
e.cAvg > 12

编辑

在您进行问题编辑之后,我认为您需要的是带有条件的SELECT e.Id,e.cAvg, t.Model A e JOIN B t ON e.id = t.id WHERE CASE WHEN e.cAvg<=6 THEN t.Model when t.Cr=6 then t.Model WHEN e.cAvg>6 and e.cAvg<=12 THEN t.Model WHEN t.Cr='12' then t.Model WHEN e.cAvg>12 and cg<=24 THEN t.Model WHEN t.Cr='24' then t.Model ELSE -1 END ! = -1 基本上,不是使用等号键联接表,而是使用不等号键联接表。

由于您要查找到t之间的cAvg。 Cr行,需要2个JOIN

JOIN

这个想法是,只有在两个条件都满足的情况下,您才能得到e的结果 希望有帮助

答案 1 :(得分:1)

我找到了解决该问题的可能方法。

问题陈述:

  • 比较两个没有公共列的表。

  • 使用CASE中的比较来选择特定的行。

  • T-SQL不接受CASE中的WHERE子句。

我的解决方法:

  • 在第二个表中添加一个新列。
  • 将表B中的ID分配给表A中的列。
  • 使用分配的ID在表B中选择所需的行。

表格:

表A:

1,2018-10-17,John
2,2018-10-12,Mary
3,2018-10-19,David

表B

+----+------+                           
| id | cAvg |
+----+------+
|  1 | .8   |
|  2 | 5.4  |
|  3 | 6.0  |
+----+------+

查询以分配ID:

+-----+-----+-------+
| Bid | Cr  | Model |
+-----+-----+-------+
| 1   | 2   | M1    |
| 2   | 5.5 | M2    |
| 3   | 8   | M3    |
+-----+-----+-------+

上述查询的结果将是如下视图:

CREATE VIEW [AssignIDView] AS
SELECT DISTINCT e.id,
       e.cAvg,
       (CASE 
            WHEN e.cAvg>=0 and e.cAvg<=2 THEN 1
            WHEN e.cAvg>2 and e.cAvg<=5.5 THEN 2
            WHEN e.cAvg>3 and e.cAvg<=8 THEN 3


        ELSE 'Invalid'
       END) As BId
FROM A e, B t;

现在使用出价从表B中选择行,以从表B中分配模型:

查询:

+----+------+-----+
| id | cAvg | Bid |
+----+------+-----+
|  1 | .8   |   1 |
|  2 | 5.4  |   2 |
|  3 | 6.0  |   3 |
+----+------+-----+

查询的结果如下:

 CREATE VIEW [ModelAssignView] AS
 select e.id,
   e.cAvg,
   t.Model as [Model]
 FROM A e, B t where e.TierID = t.id;

我的问题的目的是做上述事情。 为此,我想在CASE中找到一个等效的WHERE子句。

但是上述方法为我解决了问题。 希望对您有所帮助:)!