在OR子句SQL中使用别名

时间:2017-01-18 21:32:19

标签: sql sql-server alias

我试图在OR子句中使用列别名,但我一直收到错误:"无效的列名称' TEAM NAME'"。我已经看到了在WHERE子句中使用别名的线索,但我不确定OR是否可行。 以下是我正在使用的内容:

AND (U.Player IN ('Tom Thumb','Wallace Gromit') OR [Team Name] <> '-')

这是我的OR子句

#include <vector>
#include <math.h>

typedef unsigned int uint;

void flagPeaks(const std::vector<uint> & peaks,
    std::vector<uint> & flaggedPeaks,
    const uint & minDist)
{
    flaggedPeaks.clear();
    uint dist = peaks[peaks.size() - 1] - peaks[0];
    if (minDist > dist / 2)
        return;

    flaggedPeaks.push_back(peaks[0]);
    for (uint i = 0; i < peaks.size(); ) {
        uint j = i + 1;
        while (j < (peaks.size()) && ((peaks[j] - peaks[i]) < minDist))
            ++j;

        if (j < (peaks.size()) && ((peaks[j] - peaks[i]) >= minDist))
            flaggedPeaks.push_back(peaks[j]);
        i = j;
    }
}


int solution(std::vector<int> & A)
{
    std::vector<uint> peaks;
    uint min = A.size();
    for (uint i = 1; i < A.size() - 1; i++) {
        if ((A[i] > A[i - 1]) && (A[i] > A[i + 1])) {
            peaks.push_back(i);
            if (peaks.size() > 1) {
                if (peaks[peaks.size() - 1] - peaks[peaks.size() - 2] < min)
                    min = peaks[peaks.size() - 1] - peaks[peaks.size() - 2];
            }
        }
    }
    // minimal distance between 2 peaks is 2
    // so when we have less than 3 peaks we are done
    if (peaks.size() < 3 || min >= peaks.size())
        return peaks.size();

    const uint distance = peaks[peaks.size() - 1] - peaks[0];
    // parts are the number of pieces between peaks
    // given n + 1 peaks we always have n parts
    uint parts = peaks.size() - 1;
    // calculate maximal possible number of parts
    // for the given distance and number of peaks
    double avgOptimal = static_cast<double>(distance) / static_cast<double> (parts);
    while (parts > 1 && avgOptimal < static_cast<double>(parts + 1)) {
        parts--;
        avgOptimal = static_cast<double>(distance) / static_cast<double>(parts);
    }

    std::vector<uint> flaggedPeaks;
    // check how many peaks we can flag for the 
    // minimal possible distance between two flags
    flagPeaks(peaks, flaggedPeaks, parts + 1);
    uint flags = flaggedPeaks.size();
    if (flags >= parts + 1)
        return parts + 1;

    // reduce the minimal distance between flags
    // until the condition fulfilled
    while ((parts > 0) && (flags < parts + 1)) {
        --parts;
        flagPeaks(peaks, flaggedPeaks, parts + 1);
        flags = flaggedPeaks.size();
    }
    // return the maximal possible number of flags 
    return parts + 1;
}

2 个答案:

答案 0 :(得分:1)

不幸的是你必须写出来。 PS这应该在HAVING子句中:

AND (U.Player IN ('Tom Thumb','Wallace Gromit') OR 
CASE WHEN MAX(L.City) IN ('RY','BR') THEN 'Team 1'
WHEN MAX(L.City) IN ('JS','ND') THEN 'Team 2' 
WHEN MAX(L.City) IN ('QV','VE') THEN 'Team 3'
WHEN MAX(L.City) IN ('FB','RX') THEN 'Team 4'
ELSE '-' END,
 <> '-')

OR

AND (U.Player IN ('Tom Thumb','Wallace Gromit') OR 
MAX(L.City) NOT IN ('RY','BR','JS','ND','QV','VE','FB','RX'))

或者,您可以将整个查询视为子查询并从中选择

Select  * from (myquery) s where (U.Player IN ('Tom Thumb','Wallace Gromit') OR [Team Name] <> '-')

Similar issue here

Check out a basic example here

答案 1 :(得分:0)

您是否尝试过<script> var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].onclick = function() { this.classList.toggle("active"); var panel = this.nextElementSibling; if (panel.style.maxHeight){ panel.style.maxHeight = null; } else { panel.style.maxHeight = panel.scrollHeight + 'px'; } } } </script> 语句中的别名?

SELECT

如果这是子查询或CTE的一部分,它将允许您从外部查询请求数据中访问此列。

此外,CASE WHEN MAX(L.City) IN ('RY','BR') THEN 'Team 1' WHEN MAX(L.City) IN ('JS','ND') THEN 'Team 2' WHEN MAX(L.City) IN ('QV','VE') THEN 'Team 3' WHEN MAX(L.City) IN ('FB','RX') THEN 'Team 4' ELSE '-' END AS [TEAM NAME] 子句在任何查询/子查询中的WHERE子句之前运行,因此如果SELECT子句在WHERE子句中生成,则该别名将不可用{1}}子句在同一个查询/子查询中。