Почему бы не попробовать как
SELECT *
FROM tab_name
WHERE UPPER (category) = 'N'
AND UPPER (type) = 'Z'
AND UPPER (fk) IN ('A', 'B')
SQL Fiddle
WITH t
AS (SELECT 1 AS pk,
'A' AS fk,
'L' AS category,
'X' AS TYPE
FROM DUAL
UNION
SELECT 2 AS pk,
'A' AS fk,
'M' AS category,
'Y' AS TYPE
FROM DUAL
UNION
SELECT 3 AS pk,
'A' AS fk,
'N' AS category,
'Z' AS TYPE
FROM DUAL
UNION
SELECT 4 AS pk,
'B' AS fk,
'L' AS category,
'X' AS TYPE
FROM DUAL
UNION
SELECT 5 AS pk,
'B' AS fk,
'N' AS category,
'Z' AS TYPE
FROM DUAL
UNION
SELECT 6 AS pk,
'C' AS fk,
'L' AS category,
'X' AS TYPE
FROM DUAL
UNION
SELECT 7 AS pk,
'C' AS fk,
'M' AS category,
'Y' AS TYPE
FROM DUAL
UNION
SELECT 8 AS pk,
'C' AS fk,
'N' AS category,
'Z' AS TYPE
FROM DUAL)
(SELECT distinct *
FROM t
WHERE UPPER (category) = 'N'
AND UPPER (TYPE) = 'Z'
AND UPPER (fk) IN ('A', 'B'))
выход
╔════╦════╦══════════╦══════╗
║ PK ║ FK ║ CATEGORY ║ TYPE ║
╠════╬════╬══════════╬══════╣
║ 3 ║ A ║ N ║ Z ║
║ 5 ║ B ║ N ║ Z ║
╚════╩════╩══════════╩══════╝