1
votes

Joindre deux tables en fonction de plusieurs conditions

J'ai deux tables 1 table avec juste la colonne id, une deuxième table avec id et la colonne source.
J'essaie de créer une correspondance entre les tableaux 1 et 2 en fonction de l'ID et si la source est égale à 1. Je veux renvoyer le statut de cet identifiant comme «correspondance», si la source est 0, je veux que l'état de l'ID soit «non match '.

id status
1  no match
2  match
3  no match
4  match
5  match

Je suis à peu près sûr qu'il s'agit d'une jointure à gauche basée sur l'id des deux tables. Mais je ne sais pas comment créer une nouvelle colonne et manipuler le 'match', 'no match' en fonction de la condition source

select id, status
from t1
left join t2 
on t1.id = t2.id
where 
case source = 1 'Match'
case source = 0 'Not Matched'

Mes résultats attendus

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')


1 commentaires

Pourquoi mettez-vous CASE dans la clause WHERE ? Avez-vous également lu la documentation comment utiliser CASE ? C'est probablement la première chose à faire avant de publier une question ici. Ce n'est même pas un CASE valide.


3 Réponses :


2
votes

Veuillez essayer ci-dessous, vous devriez utiliser l'expression case-when dans votre ligne "select".

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 commentaires

C'est une expression pas une déclaration .



2
votes

Vous pouvez utiliser une condition de casse dans l'instruction select.

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql -serveur-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


0 commentaires

1
votes

Votre CASE expression doit être dans le SELECT au lieu de l'instruction Clause WHERE , dans laquelle vous pouvez vérifier la valeur de la colonne source et renvoyer Match / No Match en fonction de cela valeur comme:

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;

Renvoie:

+----+----------+
| id |  Status  |
+----+----------+
|  1 | No Match |
|  2 | Match    |
|  3 | No Match |
|  4 | Match    |
|  5 | Match    |
+----+----------+

Vous pouvez le vérifier sur la démo en direct ici .


Ceci est la Source la colonne contient deux possibl e valeurs qui est '0' ou '1' , s'il peut contenir d'autres valeurs alors:

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;

Enfin , stocker des nombres sous forme de chaînes est une mauvaise idée, pensez à utiliser INT ou BIT code> si vous avez besoin de stocker uniquement Vrai/False


0 commentaires