如何在SQL中为值列表创建别名

5

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

例如:

...

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)
  ...
  )

上述方法可以用,但我希望能够以某种方式对列表进行别名,这样就不必重复使用它。例如(以下代码实际上并不可行):
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
  ...
  )

这在T-SQL中是否可行?

我认为可以通过使用临时表来实现。 - HENG Vongkol
4个回答

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)
    )

2

T-SQL能够实现这个吗?

是的,你可以使用 表变量 或者 临时表。将列表数据放入 表变量 中,在存储过程中任何需要的地方都可以使用它。

例如:

declare @inlist1 table(elem int);
insert into @inlist1
select 02
union
select 05
union
select 15
union
select 20
union
select 21
union
select 24

立即使用

WHERE
  NOT (
    AccountWarningCode1     IN (select elem from @inlist1)

(或者)

您也可以执行一个JOIN操作,方法是

FROM Account a
JOIN @inlist1 i ON a.AccountWarningCode1 = i.elem

2

使用CTE将您的值定义为派生表。

WITH bad_warnings AS 
(SELECT val 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)) AS tbl(val)
)
SELECT * 
FROM bad_warnings

您可以将其用作查询中的任何表。
您的检查应该类似于:
WHERE SomeValue IN(SELECT val FROM badWarnings)

使用 NOT IN 可以对该列表进行取反。

0
你可以像这样做:
with bad_warnings as 
(select '02'
union
select '15'
etc
)
select * from account
where not
(AccountWarningCode1 IN (SELECT code FROM bad_warnings
etc)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接