Sql-server – How implement CASE statement in query

sql serversql-server-2008

I stuck in here.

How to implement:

CASE
WHEN m.MAXDATE is not null THEN '*'
WHEN m.MAXDATE IS NULL THEN ' '
END

In query:

SELECT Ename, Hiredate, m.MAXDATE[MAXDATE]
FROM EMP
LEFT JOIN (Select max(Hiredate)[MAXDATE] 
FROM EMP) m
on EMP.HIREDATE = m.MAXDATE

I've checked few website in order to find the answer, but it's giving me errors in every variant.

More details:

Query is:

SELECT Ename, Hiredate, m.MAXDATE[MAXDATE]
FROM EMP
LEFT JOIN (Select max(Hiredate)[MAXDATE] 
FROM EMP) m
on EMP.HIREDATE = m.MAXDATE

This is a result:

SMITH   1980-12-17 00:00:00.000 NULL
ALLEN   1981-02-20 00:00:00.000 NULL
WARD    1981-02-22 00:00:00.000 NULL
JONES   1981-04-02 00:00:00.000 NULL
MARTIN  1981-09-28 00:00:00.000 NULL
BLAKE   1981-05-01 00:00:00.000 NULL
CLARK   1981-06-09 00:00:00.000 NULL
SCOTT   1982-12-09 00:00:00.000 NULL
KING    1981-11-17 00:00:00.000 NULL
TURNER  1981-09-08 00:00:00.000 NULL
ADAMS   1983-01-12 00:00:00.000 1983-01-12 00:00:00.000
JAMES   1981-12-03 00:00:00.000 NULL
FORD    1981-12-03 00:00:00.000 NULL
MILLER  1982-01-23 00:00:00.000 NULL

I want to just put '*' instead of date in last column for ADAMS, and space ' ' where its NULL.

Best Answer

Your syntax for the CASE expression is correct (it's an expression, not a statement!) You can simplify it slightly by removing the second WHEN:

CASE WHEN m.MAXDATE IS NOT NULL THEN '*' ELSE '' END

and the query:

SELECT Ename, Hiredate, 
       CASE WHEN m.MAXDATE IS NOT NULL THEN '*' ELSE '' END AS MAXDATE
FROM EMP
  LEFT JOIN (SELECT max(Hiredate) AS MAXDATE 
             FROM EMP) m
  ON EMP.HIREDATE = m.MAXDATE ;

And you don't really need the self-join. You could have the same result with a window aggregate function:

SELECT Ename, Hiredate, 
       CASE WHEN HIREDATE = max(HIREDATE) OVER () 
           THEN '*' ELSE '' END AS MAXDATE
FROM EMP ;