我有一个主数据表,其中包含数据或当数据丢失时表示错误情况的代码。我需要: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”数据的A学校。只要total_students是错误代码,该查询就起作用,但是如果它是有效数据(如School-A),则d3上的最后一个JOIN不起作用,因为该数字(在这种情况下为2300)与错误代码表中的任何值。
有没有办法告诉它仅在满足CASE-WHEN条件的情况下才加入该联接?
谢谢!
进行联接“可选”,您将使用
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句