如何解决SQL - CASE 单个条件下的多个变量
我的 SQL 中有类似于下面的内容,我希望简化 CASE WHEN 语句 我有多个变量(即 CODE1、CODE2,一直到 CODE10,当我在“CODES”表中找到任何这些代码以创建“CODE_FLAG”变量时,我想通过 CASE 运行这些变量。
TABLE2 将包含代码列表(可能会在某天更新)。 因此,最终结果将是从 Table1 中选择所有记录以及创建的名为 CODE_FLAG 的变量,该变量只是基于 TABLE2 中的列表的“Y”或“N”。 TABLE1 最多有 10 个代码,列为 CODE1、CODE2、CODE3...等。
TABLE2
代码 |
---|
98761234 |
43216789 |
11111111 |
这是我目前所拥有的。有没有办法
WITH T2,(Select CODES
FROM TABLE2)
SELECT T1.*,CASE WHEN T1.CODE1,T1.CODE2,T1.CODE3,T1.CODE4 IN (T2.CODES)
THEN 'Y',ELSE 'N' END AS CODE_FLAG
FROM TABLE1 T1
CROSS JOIN T2 T2
或者类似的东西?
WITH T2,CASE WHEN T1.CODE1 or T1.CODE2 or T1.CODE3 or T1.CODE4 IN (select T2.CODES from T2 T2)
THEN 'Y',ELSE 'N' END AS CODE_FLAG
FROM TABLE1 T1
我目前有一个更长的版本
WITH T2,CASE WHEN T1.CODE1 in (select CODES from T2)
or T1.CODE2 in (select CODES from T2)
or T1.CODE3 in (select CODES from T2)
or T1.CODE4 in (select CODES from T2)
THEN 'Y',ELSE 'N' END AS CODE_FLAG
FROM TABLE1 T1
解决方法
使用 EXISTS() 检查。
SELECT
*,CASE WHEN EXISTS (
SELECT *
FROM T2
WHERE T2.codes IN (T1.code1,T1.code2,T1.code3,T1.code4)
)
THEN 'Y' ELSE 'N' END AS code_flag
FROM
T1
,
您的表结构规范化似乎不是一个好的设计,在一行中对同一上下文代码的多个引用并不好。它应该更像是一种父/子关系。类似的东西
MainTable
id someName someOtherThing,etc
1 Bill a
2 Linda x
3 Mark s
有一个你有兴趣捕获/目的的不同查找代码的辅助表
LookupCode
id LookupCode
1 Code1
2 Code8
3 Code74
然后,根据第一个表中的主 ID 及其可能具有的代码关联第三个表。
MainTableCodes
id MainTableID LookupCodeID
1 1 1
2 1 3
3 2 2
4 3 2
5 3 3
然后,您可以执行 join(必需)或 LEFT JOIN(非必需)以查看是否存在某些内容,例如
select
mt.id,lc.LookupCode
from
MainTable mt
LEFT JOIN MainTableCodes mtc
on mt.id = mtc.MainTableID
LEFT JOIN LookupCode lc
on mtc.LookupCodeID = lc.id
与硬引用代码和看起来很疯狂的查询相比,这将在未来提供更好的查询机会、灵活性和性能。如果您有机会尽早而不是稍后调整您的结构,也许可以这样做。将此与 MatBailie 的“存在”查询相结合,您应该可以进行更长时间的使用,并且仅此一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。