我有两个表,一个表仅包含id列,第二个表具有id和源列。
我正在尝试根据ID在表1和表2之间创建匹配,并且如果source等于1。我想返回id为“ match”的状态,如果source为0,我希望该id状态为“ not”匹配”。
DECLARE @T1 AS TABLE (
id int
)
DECLARE @T2 AS TABLE (
id int,
source int
)
INSERT INTO @T1 VALUES
(1),
(2),
(3),
(4),
(5)
INSERT INTO @T2 VALUES
(1, '0'),
(2, '1'),
(3, '0'),
(4, '1'),
(5, '1')
我非常确定这是一个左连接,并基于两个表中的id进行连接。但是我不确定如何创建新列并根据源条件来操纵“匹配”,“不匹配”
select id, status
from t1
left join t2
on t1.id = t2.id
where
case source = 1 'Match'
case source = 0 'Not Matched'
我的预期结果
id status
1 no match
2 match
3 no match
4 match
5 match
答案 0 :(得分:2)
请尝试以下操作,在“选择”行中使用case-when表达式。
select t.id, [status] = case when t2.source = 1 then 'Match' else 'Not Match' end
from @T1 t
left join @T2 t2 on t.id = t2.id
答案 1 :(得分:1)
您可以在select语句中使用大小写条件。
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017
select t1.id,
case t2.source when 0 then 'Not Matched'
when 1 then 'Match'
else ''
end as [status]
from @T1 t1
inner join @T2 t2 on t1.id = t2.id
答案 2 :(得分:1)
您的 CASE
表达式应该在 SELECT
语句中,而不是 WHERE
子句中,您可以在其中检查source
列的值,并根据该值返回Match/No Match
,如下所示:
SELECT T2.id,
CASE T2.source WHEN '1' THEN 'Match' ELSE 'No Match' END Status
FROM @T1 T1 JOIN @T2 T2
ON T1.id = T2.id;
返回:
+----+----------+
| id | Status |
+----+----------+
| 1 | No Match |
| 2 | Match |
| 3 | No Match |
| 4 | Match |
| 5 | Match |
+----+----------+
您可以在the live demo here上对其进行检查。
如果Source
列包含两个可能的值,即'0'
或'1'
,则它可能包含其他值,则:
SELECT T2.id,
CASE T2.source WHEN '1' THEN 'Match'
WHEN '0' THEN 'No Match'
WHEN 'Other Value' THEN 'Other Result' -- and so on
END Status
FROM @T1 T1 JOIN @T2 T2
ON T1.id = T2.id;