【问题标题】:(SQL) In a query, how do I use a CASE statement that would only conditionally require a JOIN?(SQL) 在查询中,如何使用仅有条件地需要 JOIN 的 CASE 语句?
【发布时间】:2013-09-11 05:20:08
【问题描述】:

我有一个主数据表,其中包含数据或在数据丢失时表示错误情况的代码。我需要: 1) 显示有效的数据 要么 2) 如果它无效(它是错误代码),则显示该错误代码的人类可读版本

错误代码的人类可读形式来自另一个表,我正在加入该表以翻译代码。

以下是主表中的一些示例数据:

Table pub_k12.schools

school_name  | title1 | school_wide_title1 | total_students
-------------+--------+--------------------+---------------
School-A     | M      | M                  | 2300
School-B     | N      | N                  | -2
School-C     | M      | N                  | -1

代码翻译表如下所示:

Table pub_k12.ref_school_field_data

data_code | data_string
----------+-------------
-1       | No Data
-2       | N/A
-9       | Bad Data
M        | No Data
N        | N/A

很遗憾,这种数据格式无法更改。这是我得到的。

这是我正在使用的查询:

SELECT s.school_name, stype.type_string, d1.data_string AS title1, d2.data_string AS school_title1,
CASE
 WHEN s.total_students::int < 0 THEN d3.data_string
 ELSE s.total_students
END "total_students"
FROM pub_k12.schools AS s
JOIN pub_k12.ref_school_type AS stype ON s.school_type = stype.type_code
JOIN pub_k12.ref_school_field_data AS d1 ON s.title1 = d1.data_code
JOIN pub_k12.ref_school_field_data AS d2 ON s.school_wide_title1 = d2.data_code
JOIN pub_k12.ref_school_field_data AS d3 ON s.total_students = d3.data_code;

(暂时忽略 stype - 这是类似的将代码转换为可读的情况)

所以我正在检查 total_students 是否 >0,在这种情况下我会直接显示它。否则,我会执行 JOIN 来翻译代码。这是我运行查询时得到的结果(为清楚起见,我省略了 type_string 字段):

school_name  | title1  | school_title1 | total_students
-------------+---------+---------------+---------------
School-B     | N/A     | N/A           | N/A
School-C     | No Data | N/A           | No Data

如您所见,没有返回具有有效“total_students”数据的 School-A。只要 total_students 是错误代码,查询就可以工作,但如果它是有效数据(例如 School-A),则 d3 上的最后一个 JOIN 不起作用,因为该数字(在本例中为 2300)不匹配错误代码表中的任何值。

有没有办法告诉它仅在满足 CASE-WHEN 条件时才执行该联接?

谢谢!

【问题讨论】:

    标签: sql postgresql join case


    【解决方案1】:

    要使连接成为“可选”,您可以使用

    LEFT OUTER JOIN
    

    普通的

    JOIN
    

    会从您的结果中过滤掉不匹配的行

    所以你可以尝试类似的东西

    LEFT OUTER JOIN pub_k12.ref_school_field_data AS d3 ON s.total_students::int < 0 AND s.total_students = d3.data_code 
    

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2022-06-21
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多