1

我有一个主数据表,其中包含数据或在数据丢失时表示错误情况的代码。我需要: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 条件时才加入?

谢谢!

4

1 回答 1

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 
于 2013-09-07T02:46:10.677 回答