2016-06-30 3 views
1

한 컬럼에 대해 내가 CASE 조건을 적용하고자하는 쿼리가 있습니다.쓰기 CASE 조건 쿼리

Select 
    a.mkey, a.party_name, a.doc_no Inward_No, 
    c.type_desc Doc_Type, a.ref_no, 
    convert(varchar(25),a.ref_date,103) Ref_date, 
    a.Inward_amt, b.first_name + ' ' + b.last_name ToUser --- here 
from 
    inward_doc_tracking_hdr a 
inner join 
    user_mst b on a.To_User = b.mkey 
inner join 
    type_mst_a c on a.doc_type = c.master_mkey 
       and a.mkey =227423 

내가 원하는 것은 : 내가 그 대신에 Last_To_User을 할 ToUser 다음 NULL로 얻을 경우 내 쿼리입니다.

SQL Server에서이 작업을 수행하는 방법은 무엇입니까?

+1

응답이있는 경우 plz이 응답으로 받아 들여 upvote :) –

+0

@NK 답변을 찾았습니까? – scsimon

답변

2

이 시도 - 단지 이름과 성 당신의 연결 주위 ISNULL를 사용

Select 
    a.mkey, a.party_name, a.doc_no Inward_No, 
    c.type_desc Doc_Type, a.ref_no, 
    convert(varchar(25),a.ref_date,103) Ref_date, 
    a.Inward_amt, 
    -- if the first_name+last_name is NULL, then take Last_To_User instead 
    ISNULL(b.first_name + ' ' + b.last_name, Last_To_User) ToUser 
from 
    inward_doc_tracking_hdr a 
inner join 
    user_mst b on a.To_User = b.mkey 
inner join 
    type_mst_a c on a.doc_type = c.master_mkey 
       and a.mkey =227423 
+0

감사합니다. marc_s. 그것은 나의 의심을 해결했다. – BNN

0

사례가 첫 번째 null 이외의 값을 반환합니다 병합 기능을 사용할 수 있습니다 필요하지 않은 대신 b.first_name + ' ' + b.last_name

b.first_name + ' ' + b.last_name + coalesce(Touser,Last_To_User) 
+0

** 오류가 발생했습니다 ** 'coalesce'키워드 근처에 잘못된 구문이 있습니다. ** – BNN

+0

내 대답을 편집했는데 구문 오류가 있습니까? – DoubleT28

+0

** Msg 207, 수준 16, 상태 1, 줄 3으로 오류가 발생했습니다. 'Touser'열 이름이 잘못되었습니다. 메시지 207, 수준 16, 상태 1, 줄 3 잘못된 열 이름 'TOUSER'. ** – BNN

0

사용하는 다음

CASE 
WHEN b.first_name IS NULL THEN b.first_name + ' ' + b.last_name 
ELSE Last_To_User 
END 
+0

이 구문이 올바른지? 내가 메시지 156, 수준 15, 상태 1, 줄 3 키워드 'IS'근처의 구문이 잘못 **로 오류가 발생합니다. ** – BNN

+1

'IIF'은 ** 새로운 기능입니다 ** SQL 서버에서 ** 2012 ** 및 따라서 그가 SQL 서버 ** 2005 년부터 OP에 * 사용할 수 없습니다 * –

+0

@marc_s : 설명 주셔서 감사합니다 – BNN

0

문제는 지금 매우 분명하다 그래서 당신에게 말할 것입니다. 내부 조인을 사용하여 user_mst 테이블을 조인합니다. 그리고 조건은 To_User이므로 To_User가 null 인 행을 이미 필터링하도록합니다. Null은 아무것도 연결할 수 없으므로 왼쪽으로 만듭니다. 가입하십시오.

Select a.mkey, a.party_name, a.doc_no Inward_No, c.type_desc Doc_Type, a.ref_no, 
    convert(varchar(25),a.ref_date,103) Ref_date, 
      a.Inward_amt, 
      case when To_User is null then Last_To_User 
      else b.first_name + ' ' + b.last_name end as ToUser --- here 
     from inward_doc_tracking_hdr a 
    left join user_mst b 
on a.To_User = b.mkey 
     inner join type_mst_a c 
    on a.doc_type = c.master_mkey 
    and a.mkey =227423  
+0

예'last_to_user'는 (는) 열입니다. 그러나 NULL 값으로 가져 가면 last_to_user 값이 표시되지 않습니다. – BNN

+0

@NK 물론 작동하지 않습니다. ToUser 열을 확인하고 b.first_name + ''을 사용합니다. 그러면 어쨌든 공백이 생기므로 내 대답을 편집하여 "ToUser가 비워두면 Last_To_User " –

+0

입니다. 귀하의 편집을 기다리고 있습니다. – BNN

0

내가 귀하의 게시물이 대부분의 사람들을 혼란 생각하고, 잠재적으로 나뿐만 아니라.

COALESCE(To_User,Last_To_User,'')

: 코멘트를 읽은 후 당신이 To_User (열, b.first_name + ' ' + b.last_name의 아닌 앨리어싱 열)이 경우 IS NOT NULL을 먹고 싶어하지만 당신은 당신이 Last_to_User .Thus 원하는 IS NULL 경우이 같은 COALESCE을 사용 해봐야 할 것 같습니다

이 당신에게 목록의 첫 번째 NOT NULL 가치를 제공 할 것입니다. 따라서 To_User IS NOT NULL 인 경우 반환됩니다. IS NULL 인 경우 Last_To_User이 반환되며, NULL이 아닌 경우 공백이 반환됩니다.

0

나는 다른 사람보다 내가 더 전문가는 아니지만이 꽤 초보 보일 수도 있지만 내 간단한 대답은 내가 덜 혼란 스러워요 있는지 확실하지 않습니다;

WITH QUERY1 AS (

Select 
a.mkey, 
a.party_name, 
a.doc_no AS Inward_No, 
c.type_desc 
Doc_Type, 
a.ref_no, 
convert(varchar(25),a.ref_date,103) AS Ref_date, 
a.Inward_amt, 
b.first_name + ' ' + b.last_name AS ToUser --- here 
from 
inward_doc_tracking_hdr a 
inner join 
user_mst b on a.To_User = b.mkey 
inner join 
type_mst_a c on a.doc_type = c.master_mkey 
      and a.mkey =227423 
      ) 
SELECT *, 
    CASE WHEN ToUser IS NULL 
    THEN Last_To_User 
    ELSE ToUser 
FROM QUERY1