如何在 SQL 中为值列表设置别名

Luk*_*uke 5 sql t-sql alias set

我需要查看一组列中是否有任何列包含列表中的值。

例如

...

SELECT * 
FROM Account
WHERE
  NOT (
    AccountWarningCode1     IN (02, 05, 15, 20, 21, 24, 31, 36, 40, 42, 45, 47, 50, 51, 52, 53, 55, 56, 62, 65, 66, 78, 79, 84, 110, 119, 120, 121, 125, 202)
    OR AccountWarningCode2  IN (02, 05, 15, 20, 21, 24, 31, 36, 40, 42, 45, 47, 50, 51, 52, 53, 55, 56, 62, 65, 66, 78, 79, 84, 110, 119, 120, 121, 125, 202)
    OR AccountWarningCode3  IN (02, 05, 15, 20, 21, 24, 31, 36, 40, 42, 45, 47, 50, 51, 52, 53, 55, 56, 62, 65, 66, 78, 79, 84, 110, 119, 120, 121, 125, 202)
  ...
  )
Run Code Online (Sandbox Code Playgroud)

上面的方法确实有效,但我想做的是给列表添加一些别名,所以我不会重复太多。

例如(这实际上不起作用)

WITH bad_warnings AS (02, 05, 15, 20, 21, 24, 31, 36, 40, 42, 45, 47, 50, 51, 52, 53, 55, 56, 62, 65, 66, 78, 79, 84, 110, 119, 120, 121, 125, 202)

SELECT * 
FROM Account
WHERE
  NOT (
    AccountWarningCode1     IN bad_warnings
    OR AccountWarningCode2  IN bad_warnings
    OR AccountWarningCode3  IN bad_warnings
  ...
  )
Run Code Online (Sandbox Code Playgroud)

这在 T-SQL 中可能吗?

Fel*_*tan 5

你的第二个版本实际上很接近。您可以使用公用表表达式:

WITH bad_warnings(code) AS(
    SELECT * FROM(VALUES
        ('02'), ('05'), ('15'), ('20'), ('21'), ('24'),
        ('31'), ('36'), ('40'), ('42'), ('45'), ('47'),
        ('50'), ('51'), ('52'), ('53'), ('55'), ('56'),
        ('62'), ('65'), ('66'), ('78'), ('79'), ('84'),
        ('110'), ('119'), ('120'), ('121'), ('125'), ('202')
    ) a(b)
)
SELECT *
FROM Account
WHERE
    NOT (
         AccountWarningCode1 IN (SELECT code FROM bad_warnings)
        OR AccountWarningCode2 IN (SELECT code FROM bad_warnings)
        OR AccountWarningCode3 IN (SELECT code FROM bad_warnings)
    )
Run Code Online (Sandbox Code Playgroud)