SQL Server:如何在条件情况下声明变量

时间:2016-08-20 16:51:26

标签: sql-server tsql

在使用'情况运行查询时遇到问题。所以我想创建一个变量来保存查询结果的值' select'到其他表。像下面的例子。请帮助我得到我想要的结果。谢谢。

SELECT 
    a.field1, a.field2, 
    a.field3 =
      CASE 
         WHEN a.field1 = 'alfa' 
            THEN
         WHEN
            -- I want to declare variable to check get value from another table with query select and condition 'WHERE' with variable declare
var varTest = (SELECT TOP 1 b.field1 FROM Table2 as b WHERE b.field2=a.field2) Then
    if varTest = 'actif' then
    SELECT (c.field4 * C.field5) as hasil FROM Table2 as c WHERE c.field1=varTest)    
       ELSE 
           a.field3 
    END                                                         
FROM  
    Table1 a(NOLOCK)  
WHERE 
    a.field1 = 'alfa'

这是样本数据:

field1 | field2 | field3 | > Table1
alfa     idAlfa      0
beta     idBeta      0
carlie   idCarlie    0


field1 | field2 | field4 | field5 | > Table2
actif    idAlfa     80       5
pasif    idBeta     50       5
other    idCarlie   10       5

结果:

field1 | field2  | field3
alfa     idAlfa    400
beta     idBeta    250
carlie   idCarlie  50

2 个答案:

答案 0 :(得分:0)

您不需要任何类型的变量来完成此任务。

一个简单的JOINCASE将获得活动(actif)记录,计算您的field4 * field5结果(hasil)或使用0表示所有被动(pasif)或其他记录,如此:

SELECT 
    a.field1, 
    a.field2,
    CASE b.field1 -- check id...
        WHEN 'actif'
            THEN b.field4 * b.field5 -- if 'actif' record, calculate result
        ELSE
            a.field3 -- not the 'actif' record, use default value
    END AS hasil
FROM Table1 AS a -- join the two tables by id name
LEFT JOIN Table2 AS b
ON a.field2 = b.field2;

如果您正在使用SQL Server 2012,则可以使用CASE压缩此IIF语句:

SELECT 
    a.field1, 
    a.field2,
    IIF(b.field1 = 'actif', b.field3 * b.field4, a.field3) AS hasil
FROM Table1 AS a
LEFT JOIN Table2 AS b
ON a.field2 = b.field2;

使用这些查询中的示例数据的结果是:

field1 |  field2  | hasil
alfa     idAlfa      400
beta     idBeta      0
charlie  idCharlie   0

为了将来参考,您在示例SQL中显示的IF语法无效。这用于影响SQL执行方式的流控制语句;通常在存储过程中看到。 IF无法在表达式中使用。相反,请使用CASEIIF语句。

答案 1 :(得分:0)

在我看来,这就是你的意图。很难完全确定。这也可能不是最有效的查询,因为避免case表达式中的子查询通常是一个好主意。

a.field3 =
    CASE WHEN a.field1 = 'alfa' THEN
        CASE WHEN (
                SELECT TOP 1 b.field1 FROM Table2 as b
                WHERE b.field2 = a.field
            ) = 'actif'
            THEN (
                SELECT c.field4 * C.field5 as hasil FROM Table2 as c
                WHERE c.field1 = 'actif'
            )    
            ELSE a.field3
        END
        ELSE null
    END