SQL 使用条件列查找 table

SQL look up table with condition column

我正在寻找一种使用 'lookup' table 获取颜色值的方法。 请参阅下面的两个 table 和查找结果的示例。

Table 列和值:

ColumnName |   Condition       | CellColor
Rank       |   > 90            | Green
Rank       | between 70 and 89 | Yellow
Rank       |   < 70            | Red
Score      |   > 89            | Purple
Score      |   < 88            | Orange

人员Table

Name | Rank | Score
Jane | 100  | 50
John | 77   | 90
Kelly| 50   | 99

我想要得到的结果

PersonnelName | Rank | RankCellColor | Score | Scoredcolor
Jane          | 100  |    Green      |  50   |  Orange
John          | 77   |   Yellow      |  90   |  Purple
Kelly         | 50   |    Red        |  99   | Purple

我尝试遍历排名和分数列,但在如何使用条件方面遇到了困难。我迷失了编码。 我真的需要帮助来解决这个问题。

如有任何帮助,我们将不胜感激!

SQL 不适用于此类问题。您可以将条件 table 构造为:

ColumnName, Lower, Upper, CellColor
Rank, 90, NULL, Green
Rank, 70,  89, Yellow
Rank, NULL, 70, Red
Score, 89, NULL, Purple
Score, NULL, 88, Orange

那么您的查询将如下所示:

select p.*, cr.color as rankcolor, cs.color as scorecolor
from personnel p left join
     conditions c
     on cr.columnname = 'Rank' and
        (p.rank >= cr.lower or cr.lower is null) and
        (p.rank <= cr.upper or cr.upper is null) left join
     conditions cs
     on cs.columnname = 'Score' and
        (p.score >= cs.lower or cs.lower is null) and
        (p.score <= cs.upper or cs.upper is null);

如果您指定颜色的下限和上限,这会容易得多。 您可以加入 table 值落在下限和上限范围内的值。

CREATE TABLE Conditions (ColumnName varchar(50), minval int, maxval int, CellColor varchar(50))
INSERT INTO Conditions
VALUES
 ('Rank', 90, 100, 'Green')
,('Rank', 70, 89, 'Yellow')
,('Rank', 0, 70, 'Red')
,('Score', 89, 100, 'Purple')
,('Score', 0, 88, 'Orange')

CREATE TABLE Personnel (Name varchar(50), Rank int, Score int)

INSERT INTO Personnel 
VALUES
 ('Jane', 100, 50)
,('John', 77, 90)
,('Kelly', 50, 99)

SELECT P.Name, P.Rank, ConRank.CellColor, P.Score, ConScore.CellColor
  FROM Personnel P 
       INNER JOIN Conditions ConRank 
        ON P.Rank >= ConRank.minval AND P.Rank <= ConRank.maxval AND ConRank.ColumnName = 'Rank'
       INNER JOIN Conditions ConScore
        ON P.Score >= ConScore.minval AND P.Score <= ConScore.maxval AND ConScore.ColumnName = 'Score'
ORDER BY P.Name   

给出输出:

Name    Rank    CellColor   Score   CellColor
Jane    100     Green       50      Orange
John    77      Yellow      90      Purple
Kelly   50      Red         99      Purple

参考这个 sqlfiddle:http://sqlfiddle.com/#!6/15f3a/6