【问题标题】:Using Where clause in Case to compare在 Case 中使用 Where 子句进行比较
【发布时间】:2019-03-28 21:37:27
【问题描述】:

我是 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=5.5 => 选择的模型必须是 M3。)

我想要得到的结果是:

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

我厌倦了按照 cmets 的建议加入,非常感谢,因此我学到了很多东西!!。

我的问题是没有可加入的公共列。 我还需要将一个表中的列与另一个表中的列进行比较,然后根据比较给出结果。

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

我尝试了以下方法:

  • 内连接
  • 案例

我需要一个方向,我需要进入哪个方向。 谢谢!!

【问题讨论】:

  • 你需要加入你的表,你通过不发出加入条件得到一个笛卡尔积。切换到显式 JOIN..ON 语法(只要我记得,它就是标准)
  • 查看docs.microsoft.com/en-us/sql/relational-databases/performance/…了解如何使用FROM A JOIN B ON ...
  • 还显示一些示例数据(足以满足您的所有条件)和期望的结果。单词问题和不符合您要求的查询不足以编写符合要求的查询。
  • @HoneyBadger 嗨,感谢您对加入的指导,我试过了,但我的问题是表之间没有公共列。我意识到描述含糊不清,因此我更新了问题。谢谢你的帮助!!

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


【解决方案1】:

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

如果表之间有匹配的键,那么只会比较相关的行对,应该在 JOIN 语句中使用它:

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

第二,为了选择相关的行,你应该决定这些是什么...... 您可以在 WHERE 语句中定义不同的案例

WHERE
e.cAvg > 12

您可以在 WHERE 中使用 case 语句,但结果应该以返回 TRUE 为条件

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

编辑

在您编辑问题后,我认为您需要的是带有条件的JOIN 基本上,不是用相等的键连接表,而是用不相等的键连接它们。

因为您正在寻找 cAvg BETWEEN to t。 Cr 行,需要 2 个 JOIN

SELECT e.Id,e.cAvg, t.Model
   FROM
     A e JOIN B t ON
e.cAvg >= t.Cr
     JOIN B t2 ON
e.cAvg < t2.Cr
WHERE
t.Cr IS NOT NULL
AND t2.Cr IS NOT NULL

这个想法是只有在满足 2 个条件的情况下,你才会得到 e 的结果 希望有帮助

【讨论】:

  • @AbhilashGopalakrishna 当然。一个赞成票(如果一个好的答案是一个 vi 标记)会很好:)
  • 您好,谢谢您的指导!!!我经历了加入,我更新了这个问题,因为我意识到它太模糊了。我的问题如下: - 这两个表没有共同的列来使用 JOIN。 - 我希望表 B 只比较 A 和 B 的值。 - 然后我需要在表 B 中选择满足比较的行。 - 从同一行中,我想从表 B 中选择一个列值。 JOIN as I理解选择所有行,但我只想选择满足比较的行。
  • 完全迷路了。我猜我的逻辑是错误的,但是对于 t-sql 或任何类型的查询语言都是新手,我不知道用什么来实现逻辑。谢谢!!
  • @AbhilashGopalakrishna 乐于助人。尝试编辑问题,我会编辑答案,也许我可以提供更多帮助:)
【解决方案2】:

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

问题陈述:

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

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

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

我的工作:

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

表格:

表 A:

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

表 B

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

查询分配ID:

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;

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

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

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

查询:

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

查询结果如下:

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

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

但上述方法为我实现了解决方案。 希望对你有帮助:)!

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2018-08-03
    • 2021-03-14
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多