2009-02-03 5 views
4

Может быть, вы можете помочь мне с SQL Query:Условный ВЫБРАТЬ колонки

У меня есть значение преобразования в второй таблице и следующую структуру:

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

Мне нужен результат Set Как что приоритет первого столбца, в случае NULL, дает мне второе значение столбца, умноженное на значение преобразования, сохраненное во вторичной таблице. Нечто подобное, в псевдокоде:

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

Я думаю, что это должно быть просто с помощью соединения, но я не могу понять это!

Заранее спасибо.

+0

Возможно, не лучший дизайн. –

+0

Не могли бы вы пометить этот вопрос тем, что ваша целевая БД? –

+0

Ну, моя целевая БД - это SQL DB ... поскольку я абстрагирую базу данных. –

ответ

9

псевдокода, а также:

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 

Очевидно, что вам нужно настроить соединение. Но я думаю, что это сделает трюк.

3

оператор coalesce() делает именно то, что вы хотите сделать в своем примере, он проверяет значение null в поле и затем предоставляет другое значение, если оно равно null. Но если вы хотите сделать что-то, кроме теста на нуль (и он будет работать для нулей, а), вы можете использовать случай заявление:

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

Предполагая, что вы используете SQL Server, или какую-либо другая систему, которая поддерживает пользователь -определенной функции я бы рассмотреть вопрос о создании функции, инкапсулированный логику так мой выбор был бы

ВЫБРАТЬ udf_getPrice (идентификатор) от tbl1

Хотя это наложит некоторые накладные расходы, казалось бы, скорее всего, мне из вашего вопроса, вы не в такой ситуации, когда производительность важна для запроса. Преимущество использования функции заключается в том, что тип используемого вами запроса - это тот, где могут произойти изменения в бизнесе, например, вы можете начать поиск в евро или йене в дополнение к долларам, или правила, используемые для расчета, могут измениться. Инкапсуляция логики преобразования в функцию добавит слой абстракции, который мог бы заплатить красиво для будущего обслуживания.

1

Другой способ:

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*/ 

Но я бы рекомендовал либо вариант сливаться выше (если у вас есть 3 или более вариантов), или IsNull (так как она выглядит, как у вас есть 2 варианта).

Смежные вопросы