需要条件查询的子查询

时间:2018-09-14 01:04:08

标签: sql-server subquery

我正在使用一组使用以下查询的车辆数据:

template<class T>
typename iVector<T>::iterator iVector<T>::begin()
^^^^^^^^^^^^^^^^^^^^^

查询从表中提取车辆VIN(VIN_NUM)以及它是否位于两个区域之一(REGION_IND)“ 1”或“ 2”。它还会拉出一列“ REG_CHANGE”,以检查自上次报告以来车辆注册是否已更改两个区域之间的位置。这三个都来自同一张桌子。

REG_CHANGE如果没有更改,则为空白(不为NULL),如果有更改,则包含新的区域位置“ 1”或“ 2”。在带有REGION_IND的CASE语句中使用它,为数据库中的所有车辆提供当前位置,别名为[最终位置]。

由于REGION_IND是一个表列,因此如果我想要原始区域,该代码将起作用。但是,我无法使用[最终位置],因为WHERE语句不允许使用别名。我想这将是SELECT列中的子查询构造,但我不确定它的结构。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以在下面写下您的位置

   SELECT 
            VIN_NUM AS [Registration VIN]
            ,REGION_IND AS [Location of Registration]
            ,REG_CHANGE AS [Changed Location Since Last Check]
            ,CASE 
                WHEN REG_CHANGE = '' THEN REGION_IND 
                ELSE REG_CHANGE 
            END AS [Final Location]
        FROM
            dbo.All_Tests
        WHERE
        VIN_NUM LIKE '1FM%' AND
        (
            (REGION_IND = '1' and REG_CHANGE ='Upstate') OR
            (REGION_IND = '2' and REG_CHANGE ='Downstate') OR                
            (REG_CHANGE = 'Downstate')
       )

答案 1 :(得分:0)

一种有用的方法是在apply子句中使用from运算符,然后允许在where子句中使用该列别名:

SELECT
    VIN_NUM    AS [registration vin]
  , REGION_IND AS [location of registration]
  , REG_CHANGE AS [changed location since last check]
  , ca.[final location]
FROM dbo.All_Tests
CROSS APPLY (
    SELECT
        CASE
            WHEN REG_CHANGE = '' THEN REGION_IND
            ELSE REG_CHANGE
        END AS [final location]
    ) ca
WHERE VIN_NUM LIKE '1FM%'
AND ca.[final location] = 'Downstate'

后面对àpply的任何进一步使用也可以使用这些列别名。

btw:尽管SQL选择查询以select子句开头,但该子句在from和where子句之后执行。因此,在from子句中定义列别名可以使该别名在查询执行的更早时间内可用。