2009-02-03 8 views
4

Peut-être que vous pouvez me aider avec une requête SQL:conditionnelle SELECT d'une colonne

J'ai une valeur de conversion dans une table secondaire et la structure suivante:

ID PRICE_BRL PRICE_USD 
-- --------- --------- 
1 10  5 
2 12  NULL 
3 NULL  3 
4 14  NULL 
5 NULL  4 
6 NULL  NULL 

je besoin d'un ensemble de résultats Comme ça donne la priorité à la première colonne, dans le cas de NULL, me donne la deuxième valeur de la colonne multipliée par la valeur de conversion stockée dans la table secondaire. Quelque chose comme, en pseudo-code:

SELECT 
    id, 
    (
    IF (price_brl != null) 
    price_brl 
    ELSE 
    price_usd * tbl_2.value 
) as final_price 
FROM tbl_1 

Je pense qu'il doit être simple avec des jointures, mais je ne peux pas comprendre!

Merci d'avance.

+0

Probablement pas le meilleur design. –

+0

Pouvez-vous marquer cette question avec quelle est votre BD cible? –

+0

Eh bien, ma base de données cible est une base de données SQL ... puisque je suis abstraite de la base de données. –

Répondre

9

code pseudo ainsi:

select id, coalesce(price_brl, price_usd * tbl_2.value) 
from tbl_1 
inner join tbl2 
3
select id, isnull(price_brl, price_usd * tbl_2.value) 
from tbl_1 
    inner join tbl_2 
     on tbl_1.id=tbl_2.id 

De toute évidence, vous aurez besoin d'ajuster la jointure. Mais je pense que cela fera l'affaire.

3

L'instruction coalesce() fait exactement ce que vous voulez faire dans votre exemple, elle teste null dans le champ et fournit une valeur différente si elle est nulle. Mais si vous voulez faire quelque chose en dehors test nul (et cela fonctionnera pour nulls aussi bien), vous pouvez utiliser une déclaration de cas:

SELECT id, CASE WHEN price_brl != NULL THEN price_brl ELSE price_usd * tbl_2.value END as final price... 
0

En supposant que vous utilisez SQL Server, ou un autre système qui prend en charge l'utilisateur fonctions -defined je considère la création d'une fonction qui encapsulées la logique donc ma sélection serait

SELECT udf_getPrice (id) de tbl1

Bien que cela imposerait certains frais généraux, il semble probable que moi de votre question, vous êtes pas dans une position où les performances sont critiques pour la requête. L'avantage d'utiliser une fonction est que le type de requête que vous utilisez est celui dans lequel des modifications métier sont susceptibles de se produire. Par exemple, vous pouvez commencer à utiliser Euros ou Yen en plus des Dollars ou modifier les règles utilisées pour le calcul. L'encapsulation de la logique de conversion dans une fonction ajoutera une couche d'abstraction qui pourrait être payante pour la maintenance future.

1

Une autre façon serait:

SELECT id, 
CASE WHEN price_brl IS NULL THEN (price_usd * tbl_2.Value) 
ELSE 
price_brl 
END AS Final_Price 
FROM tbl_1 
JOIN tbl_2 ON /*Join Conditions and then Where conditions*/ 

Mais je vous recommande soit l'option Coallesce ci-dessus (si vous avez 3 ou plus d'options), ou IsNull (car il semble que vous avez 2 choix).

Questions connexes