Условный SELECT столбца - PullRequest
4 голосов
/ 03 февраля 2009

Может быть, вы можете помочь мне с SQL-запросом:

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

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

Мне нужен результирующий набор. Подобно тому, как приоритизация первого столбца, в случае NULL, дает мне значение второго столбца, умноженное на значение преобразования, сохраненное во вторичной таблице. Что-то вроде в псевдокоде:

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

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

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

Ответы [ 5 ]

9 голосов
/ 03 февраля 2009

Псевдокод:

select id, coalesce(price_brl, price_usd * tbl_2.value) 
from tbl_1
inner join tbl2
3 голосов
/ 03 февраля 2009

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

SELECT id, CASE WHEN price_brl != NULL THEN price_brl ELSE price_usd * tbl_2.value END as final price...
3 голосов
/ 03 февраля 2009
select  id, isnull( price_brl, price_usd * tbl_2.value)
from    tbl_1
    inner join tbl_2
        on tbl_1.id=tbl_2.id

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

1 голос
/ 03 февраля 2009

Другой способ будет:

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

Но я бы порекомендовал либо опцию Coallesce, указанную выше (если у вас есть 3 или более опций), либо IsNull (поскольку, похоже, у вас есть 2 варианта).

0 голосов
/ 03 февраля 2009

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

ВЫБЕРИТЕ udf_getPrice (id) из tbl1

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

...