2010-04-21 3 views
1

Problème: Une colonne de base de données a un Tristate (0,1,2). Chacune des valeurs est utilisée sur le serveur.Modifier la valeur de retour de l'instruction SELECT (TSQL) [requête d'optimisation]

Le code client (qui ne peut plus être modifié) ne peut comprendre que «0,1». Dans la vue Clients, '1' est identique à '2'. Donc, je veux changer la requête SQL dans la base de données pour retourner '1', si la valeur spécifique est> 0.

Ma solution actuelle combine 2 sélections (en utilisant UNION SELECT) avec différentes clauses WHERE et en retournant '1 'ou' 0 'comme valeurs statiques. Maintenant, je cherche une solution pour 'traduire' la valeur dans une seule instruction SELECT.

Voici ma solution actuelle:

SELECT 
dbo.Nachricht.NachrichtID, dbo.Nachricht.Bezeichnung, '1' AS BetrifftKontoeinrichtung, 
FROM   dbo.Nachricht INNER JOIN dbo.AdditionalData 
ON dbo.Nachricht.NachrichtID = dbo.AdditionalData.NachrichtID 

WHERE  (dbo.Nachricht.NachrichtID in (450,439)) 
AND dbo.AdditionalData.BetrifftKontoeinrichtung > 0 

UNION SELECT 
dbo.Nachricht.NachrichtID, dbo.Nachricht.Bezeichnung, '0' AS BetrifftKontoeinrichtung, 
FROM   dbo.Nachricht INNER JOIN dbo.AdditionalData 
ON dbo.Nachricht.NachrichtID = dbo.AdditionalData.NachrichtID 

WHERE  (dbo.Nachricht.NachrichtID in (450,439)) 
AND dbo.AdditionalData.BetrifftKontoeinrichtung = 0 

Répondre

4

Vous pouvez utiliser une instruction case, comme ceci:

SELECT 
    dbo.Nachricht.NachrichtID, dbo.Nachricht.Bezeichnung, 
    CASE WHEN dbo.AdditionalData.BetrifftKontoeinrichtung = 0 
     THEN '0' ELSE '1' 
    END AS BetrifftKontoeinrichtung, 
FROM dbo.Nachricht 
INNER JOIN dbo.AdditionalData 
     ON dbo.Nachricht.NachrichtID = dbo.AdditionalData.NachrichtID  
WHERE (dbo.Nachricht.NachrichtID in (450,439)) 
+0

Aimez la réponse, merci! –

0

Si vous venez CAST(CAST(val AS BIT) AS INT) vous obtiendrez entier 0 pour 0 et 1 entier pour tout le reste.