如何为 SQL 中的值列表设置别名
How to alias a list of values in SQL
我需要查看一组列中是否有任何列包含列表中的值。
E.G
...
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 中可能吗?
Is this possible in T-SQL?
是的,使用 table variable
或 temporary table
。在 table variable
中填充那些 inlist 数据,并在您的过程中尽可能多地使用它。
示例:
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
这是将您的值定义为 CTE 的派生 table 的方法。
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
您可以在查询中将其用作任何 table。
您的支票类似于
WHERE SomeValue IN(SELECT val FROM badWarnings)
使用 NOT IN
你会否定这个列表
您的第二个版本实际上很接近。您可以使用常见的 table 表达式:
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)
)
你可以这样做:
with bad_warnings as
(select '02'
union
select '15'
etc
)
select * from account
where not
(AccountWarningCode1 IN (SELECT code FROM bad_warnings
etc)
我需要查看一组列中是否有任何列包含列表中的值。
E.G
...
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 中可能吗?
Is this possible in T-SQL?
是的,使用 table variable
或 temporary table
。在 table variable
中填充那些 inlist 数据,并在您的过程中尽可能多地使用它。
示例:
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
这是将您的值定义为 CTE 的派生 table 的方法。
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
您可以在查询中将其用作任何 table。
您的支票类似于
WHERE SomeValue IN(SELECT val FROM badWarnings)
使用 NOT IN
你会否定这个列表
您的第二个版本实际上很接近。您可以使用常见的 table 表达式:
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)
)
你可以这样做:
with bad_warnings as
(select '02'
union
select '15'
etc
)
select * from account
where not
(AccountWarningCode1 IN (SELECT code FROM bad_warnings
etc)