2016-06-20 2 views
0

Извините, если это будет глупый вопрос, я впервые использую хранимые процедуры SQL. Вопрос прост - как я могу объявить, если оператор внутри SELECT? Для того, чтобы показать, что я имею в виду, вот код, который я в настоящее время:SQL Хранимые процедуры, если оператор внутри select

INSERT INTO @trAll 
SELECT tr.EventDateTime 
    ,tr.OrderId 
    ,'EX' 
    ,round(tr.Prod01_CompB_QuantityPV_LTR + tr.Prod01_Fuel_QuantityPV_LTR,0) 
    ,tr.eAD 
    ,tr.OperatorName 
    -- 
    ,cmr.ConsigneeName 
    ,cmr.ConsigneeCompanyCode 
    ,cmr.SenderName 
    ,cmr.SenderCompanyCode 
FROM vwTransaction AS tr 
inner join tbOrderDetailCMR as cmr 
on tr.orderid = cmr.OrderId 
WHERE tr.EventDateTime BETWEEN @From 
     AND @to 
     AND ProductName = 'BIODIESELZ' 

И это то, что мне нужно (надеюсь, вы поймете, что я имею в виду):

INSERT INTO @trAll 
SELECT tr.EventDateTime 
    ,tr.OrderId 
    ,'EX' 
    ,round(tr.Prod01_CompB_QuantityPV_LTR + tr.Prod01_Fuel_QuantityPV_LTR+ (if (tr.Prod01_AdditiveA>0) THEN tr.Prod01_AdditiveA ELSE tr.Prod01_AdditiveB),0) 
    ,tr.eAD 
    ,tr.OperatorName 
    -- 
    ,cmr.ConsigneeName 
    ,cmr.ConsigneeCompanyCode 
    ,cmr.SenderName 
    ,cmr.SenderCompanyCode 
FROM vwTransaction AS tr 
inner join tbOrderDetailCMR as cmr 
on tr.orderid = cmr.OrderId 
WHERE tr.EventDateTime BETWEEN @From 
     AND @to 
     AND ProductName = 'BIODIESELZ' 

Короче, что мне нужно добавить AdditiveA, если его значение больше 0, иначе AdditiveB внутри select statement.

+1

Какие СУБД вы используете? –

ответ

4

синтаксисом, который вы используете, я предполагаю, что это T-SQL (Microsoft SQL-Server):

Вы не можете использовать IF в заявлении, как это. Используйте CASE здесь, как это:

... 
,round(tr.Prod01_CompB_QuantityPV_LTR + tr.Prod01_Fuel_QuantityPV_LTR+ 
(CASE 
    WHEN (tr.Prod01_AdditiveA>0) THEN tr.Prod01_AdditiveA 
    ELSE tr.Prod01_AdditiveB 
END),0) 
... 

EDIT: На самом деле, теперь, когда я прочитал это, Ashwin Nairs ответ еще лучше. Он использует команду IIF, которая менее «навязчива». Возможно, вы захотите посмотреть и/или принять его ответ.

3

Предполагая, что вы используете SQL-сервер, попробуйте использовать вместо iif

INSERT INTO @trAll 
SELECT tr.EventDateTime 
,tr.OrderId 
,'EX' 
,round(tr.Prod01_CompB_QuantityPV_LTR + tr.Prod01_Fuel_QuantityPV_LTR+ iif(tr.Prod01_AdditiveA>0, tr.Prod01_AdditiveA, tr.Prod01_AdditiveB),0) 
,tr.eAD 
,tr.OperatorName 
-- 
,cmr.ConsigneeName 
,cmr.ConsigneeCompanyCode 
,cmr.SenderName 
,cmr.SenderCompanyCode 
FROM vwTransaction AS tr 
inner join tbOrderDetailCMR as cmr 
on tr.orderid = cmr.OrderId 
WHERE tr.EventDateTime BETWEEN @From 
    AND @to 
    AND ProductName = 'BIODIESELZ' 
Смежные вопросы