I have a table with fields addr1, addr2, addr3, …, addr10. There are other fields as well as these 10.
Now I want to select all records where between 3 and 6 of the above fields are equal to “some string”. It doesn’t matter which combination. I just need at least 3 and at most 6 of [addr1, …, addr10] to equal “some string”.
select <columns>
from t
where
case when addr1 = 'some string' then 1 else 0 end +
case when addr2 = 'some string' then 1 else 0 end +
case when addr3 = 'some string' then 1 else 0 end +
case when addr4 = 'some string' then 1 else 0 end +
case when addr5 = 'some string' then 1 else 0 end +
case when addr6 = 'some string' then 1 else 0 end +
case when addr7 = 'some string' then 1 else 0 end +
case when addr8 = 'some string' then 1 else 0 end +
case when addr9 = 'some string' then 1 else 0 end +
case when addr10 = 'some string' then 1 else 0 end between 3 and 6
SELECT
t.id
FROM
my_table t
CROSS
JOIN
(
SELECT 1 num
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9
UNION ALL
SELECT 10
) i
WHERE
(i.num = 1 AND t.addr1 = 'foo') OR
(i.num = 2 AND t.addr2 = 'foo') OR
(i.num = 3 AND t.addr3 = 'foo') OR
(i.num = 4 AND t.addr4 = 'foo') OR
(i.num = 5 AND t.addr5 = 'foo') OR
(i.num = 6 AND t.addr6 = 'foo') OR
(i.num = 7 AND t.addr7 = 'foo') OR
(i.num = 8 AND t.addr8 = 'foo') OR
(i.num = 9 AND t.addr9 = 'foo') OR
(i.num = 10 AND t.addr10 = 'foo')
GROUP
BY
t.id
HAVING
COUNT(*) BETWEEN 3 AND 6