patternsqlModerate
Operators similar to 'in' that compares two sets
Viewed 0 times
comparestwothatsetssimilaroperators
Problem
I want to compare two sets of values and see whether there are intersections. The first set of values are specified at the runtime and the second set of values are stored in a row of a database.
Here are some sample code:
I feel that the code is too cumbersome, and am wondering whether there are some simple way to do it. Thanks!
Here are some sample code:
CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)
INSERT INTO #tab1
VALUES (1,2,3),(0,0,0),(0,4,0)
Select
a = (case when 1 IN (var1,var2,var3) OR
2 IN (var1,var2,var3) OR
3 IN (var1,var2,var3)
THEN 1 else 0 end)
from #tab1I feel that the code is too cumbersome, and am wondering whether there are some simple way to do it. Thanks!
Solution
You can just
If the list was very long, I'd probably create it in a #temp table in advance instead of doing it in the statement, but the
Similarly, we could used
Test at dbfiddle.uk.
JOIN to real or dynamically derived tables:DECLARE @var1 INT=2;
DECLARE @var2 INT=15;
DECLARE @var3 INT=-7;
IF EXISTS (SELECT 1 FROM
(VALUES (1),(2),(3))tableNums(number)
INNER JOIN (VALUES (@var1), (@var2), (@var3))tableVars(var)
ON tableNums.number=tableVars.var
)
SELECT 1 --or do something else interesting
ELSE SELECT 0 --or do the oppositeIf the list was very long, I'd probably create it in a #temp table in advance instead of doing it in the statement, but the
JOIN and EXISTS logic would be the same.Similarly, we could used
INTERSECT instead of JOIN:CASE WHEN EXISTS ( SELECT * FROM (VALUES (1), (2), (3)) AS x(i)
INTERSECT
SELECT * FROM (VALUES (@var1), (@var2), (@var3)) AS y(i)
)
THEN 1 ELSE 0 ENDTest at dbfiddle.uk.
Code Snippets
DECLARE @var1 INT=2;
DECLARE @var2 INT=15;
DECLARE @var3 INT=-7;
IF EXISTS (SELECT 1 FROM
(VALUES (1),(2),(3))tableNums(number)
INNER JOIN (VALUES (@var1), (@var2), (@var3))tableVars(var)
ON tableNums.number=tableVars.var
)
SELECT 1 --or do something else interesting
ELSE SELECT 0 --or do the oppositeCASE WHEN EXISTS ( SELECT * FROM (VALUES (1), (2), (3)) AS x(i)
INTERSECT
SELECT * FROM (VALUES (@var1), (@var2), (@var3)) AS y(i)
)
THEN 1 ELSE 0 ENDContext
StackExchange Database Administrators Q#176480, answer score: 10
Revisions (0)
No revisions yet.