2

I want to print all employee names and also if the employee is present in a table.

EMP_ID ENAME
1 ALLEN
2 MAX
3 BEN
EMP_ID EC_CODE
1 CONFIG_1
2 CONFIG_2
3 CONFIG_1

Query:

SELECT 
    ename, 
    (CASE 
         WHEN EXISTS (SELECT 1 FROM m_emp_config ec 
                      WHERE ec_code = 'CONFIG_1' AND emp_id = emp.emp_id) 
             THEN 'Y' 
             ELSE 'N' 
     END) config
FROM 
    emp emp

Can we write the CASE WHEN EXISTS in the WHERE clause instead of there?

I am new to SQL, please help me.

Expected output for the SQL statement:

ENAME CONFIG
ALLEN Y
MAX N
BEN Y
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
smriti
  • 23
  • 4

3 Answers3

2

Your current query is correct for doing this via exists. Here is an alternative version using a left join:

SELECT DISTINCT
    e.ENAME,
    CASE WHEN ec.EMP_ID IS NOT NULL THEN 'Y' ELSE 'N' END AS CONFIG
FROM emp e
LEFT JOIN m_sys.m_emp_config ec
    ON ec.EMP_ID = e.EMP_ID AND
       ec.ec_code = 'CONFIG_1'
ORDER BY e.EMP_ID;
Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360
0

Using Decode statement

SELECT em.ename, DECODE(econ.ec_code,'Config_1', 'Y','N') AS config FROM emp em JOIN m_emp_config econ ON econ.emp_id = em.emp_id ORDER BY em.emp_id;

Using Case statement

SELECT em.ename, Case econ.ec_code when 'Config_1' then 'Y' Else 'N' END AS config FROM emp em JOIN m_emp_config econ ON econ.emp_id = em.emp_id ORDER BY em.emp_id;

-1

You can also use DECODE instead of a CASE WHEN construct.

SELECT DISTINCT
e.ename, 
DECODE(ec.ec_code,NULL, 'N','Y') AS config
FROM emp e
LEFT JOIN m_emp_config ec
ON ec.emp_id = e.emp_id AND
ec.ec_code = 'Config_1'
ORDER BY e.emp_id;
Jonas Metzler
  • 4,517
  • 1
  • 5
  • 17