我正在使用一组使用以下查询的车辆数据:
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列中的子查询构造,但我不确定它的结构。
有人有什么建议吗?
答案 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子句中定义列别名可以使该别名在查询执行的更早时间内可用。