2016-06-03 9 views
3

Ich muss sehen, wenn einer der Spalten einen Wert in einer Liste enthält.Wie Alias ​​eine Liste von Werten in SQL

z.B

... 

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

Die oben funktioniert, aber was ich möchte stattdessen alias der Liste zu tun, einige, wie so viel ich mich nicht wiederholen recht.

Zum Beispiel (das nicht wirklich funktionieren)

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

Ist das möglich in T-SQL?

+0

Ich denke, es mithilfe temporäre Tabelle möglich ist. –

Antwort

2

Ihre zweite Version negieren würde, ist eigentlich in der Nähe. Sie können einen allgemeinen Tabellenausdruck verwenden:

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

Ist dies in T-SQL möglich?

Ja, verwenden Sie entweder table variable oder temporary table. Füllen Sie diese inlist Daten in table variable und verwenden Sie es so viele Orte innerhalb Ihrer Prozedur, die Sie wollen.

Beispiel:

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 

Verwenden Sie es jetzt

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

(OR)

Sie können auch eine JOIN Operation durchführen zu sagen

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

Dies ist wa y um eine abgeleitete Tabelle mit Ihren Werten als CTE zu definieren.

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 

Sie können dies als beliebige Tabelle in Ihrer Abfrage verwenden.

Ihr Scheck etwas wie

WHERE SomeValue IN(SELECT val FROM badWarnings) 

Mit NOT IN würden Sie diese Liste

0

Sie können es wie folgt tun:

with bad_warnings as 
(select '02' 
union 
select '15' 
etc 
) 
select * from account 
where not 
(AccountWarningCode1 IN (SELECT code FROM bad_warnings 
etc)