Reputation: 5044
My aim is to have the equivalent of this
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM CFE_DIR_PMOR INNER JOIN CFE_DIR_PPHY
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND CFE_DIR_PMOR.GESTDEL IS NULL
AND CFE_DIR_PPHY.GESTDEL = '1'
UNION ALL
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM table1
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL IS NULL
UNION ALL
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM table1
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL = '1'
AND CFE_DIR_PMOR.rep_legal= '1'
UNION ALL
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM table1
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL = '1'
AND CFE_DIR_PMOR.rep_legal != 1
AND CFE_DIR_PPHY.ORDRE = '00'
As you can see, it is burdensome and a CASE in the WHERE can be a good solution. So this is what I did
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM table1
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND
CASE WHEN CFE_DIR_PMOR.GESTDEL IS NULL AND CFE_DIR_PPHY.GESTDEL = '1' THEN 1
WHEN CFE_DIR_PMOR.GESTDEL = '1' AND CFE_DIR_PPHY.GESTDEL IS NULL THEN 1
ELSE
CASE WHEN CFE_DIR_PMOR.GESTDEL = '1' AND CFE_DIR_PPHY.GESTDEL = '1' AND CFE_DIR_PMOR.rep_legal= 1 THEN 1
WHEN CFE_DIR_PMOR.GESTDEL = '1' AND CFE_DIR_PPHY.GESTDEL = '1' AND CFE_DIR_PMOR.rep_legal != 1 AND CFE_DIR_PPHY.ORDRE = '00' THEN 1
ELSE 0
END
END =1
Question:
Thanks
Upvotes: 0
Views: 59
Reputation: 11
**Combined common filters from the last two case statements**
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM
CFE_DIR_PMOR INNER JOIN CFE_DIR_PPHY
ON CFE_DIR_PMOR.[Column] = CFE_DIR_PPHY.[Matching Column]
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND
(
(CFE_DIR_PMOR.GESTDEL IS NULL AND
CFE_DIR_PPHY.GESTDEL = '1')
OR
(CFE_DIR_PMOR.GESTDEL = '1' AND
CFE_DIR_PPHY.GESTDEL IS NULL )
OR
(
(CFE_DIR_PMOR.GESTDEL = '1' AND
CFE_DIR_PPHY.GESTDEL = '1')
AND
(
(CFE_DIR_PMOR.rep_legal= '1')
0R
(CFE_DIR_PMOR.rep_legal != 1
AND CFE_DIR_PPHY.ORDRE = '00')
)
)
)
Upvotes: 1
Reputation: 5482
Using some logic to reduce the number of OR
s which can slow a query way down
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM Table1
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND
(cast((isnull(@id2,'')+isnull(@id,'')) as int)=1)
OR
((CFE_DIR_PMOR.GESTDEL = '1'AND CFE_DIR_PPHY.GESTDEL = '1')
AND
(CFE_DIR_PMOR.rep_legal= '1' OR CFE_DIR_PPHY.ORDRE = '00'))
Is Table1 the same as the Inner Join
you want perform?
Upvotes: 2
Reputation: 1269953
Why would you want case
in the where
, when or
would do:
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM CFE_DIR_PMOR INNER JOIN
CFE_DIR_PPHY
ON ??
WHERE <cdt1> AND <cdt2> ... AND <cdt5> AND
( (CFE_DIR_PMOR.GESTDEL IS NULL AND CFE_DIR_PPHY.GESTDEL = '1') OR
(CFE_DIR_PMOR.GESTDEL = '1' AND CFE_DIR_PPHY.GESTDEL IS NULL) OR
. . .
);
In addition, if you are using JOIN
, you should have an ON
clause. I'm not sure which conditions go there.
Upvotes: 2
Reputation: 11205
Use OR
SELECT CFE_DIR_PMOR.col1,CFE_DIR_PMOR.col2,CFE_DIR_PMOR.col3
FROM CFE_DIR_PMOR INNER JOIN CFE_DIR_PPHY
ON CFE_DIR_PMOR.[Something] = CFE_DIR_PPHY.[Something]
WHERE <cdt1> AND <cdt2> ... AND <cdt5>
AND ((CFE_DIR_PMOR.GESTDEL IS NULL
AND CFE_DIR_PPHY.GESTDEL = '1')
OR (CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL IS NULL )
OR (CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL = '1'
AND CFE_DIR_PMOR.rep_legal= '1')
OR (CFE_DIR_PMOR.GESTDEL = '1'
AND CFE_DIR_PPHY.GESTDEL = '1'
AND CFE_DIR_PMOR.rep_legal != 1
AND CFE_DIR_PPHY.ORDRE = '00'))
Upvotes: 4