SQL Case语句可以评估多个列并返回与值条件匹配的列?

时间:2019-01-30 15:04:10

标签: sql sql-server case criteria

感谢您对发布的说明。我试图使其保持简单,但是这里有一些其他细节/深度可以帮助我实现目标。

基本上,我想搜索3个不同的字段,然后首先确定“大学”课程(如果有)。 如果没有有效的本科课程,那么我想搜索“研究生”课程(如果存在)。 如果不存在研究生课程,那么我想搜索“博士”课程。

我要尝试处理6列。这是一个示例:

Program1    Program2    Program3    AcadLevel1  AcadLevel2  AcadLevel3
DNP.FNP     GR          NULL            DO          GR          NULL
MS.ACT      BS.BUAN     NULL            GR          UG          NULL
DNP.FNP     GR          NULL            DO          GR          NULL
EDD.EDLC    GR          NULL            DO          GR          NULL
MAED.EDL    EDD.EDLC    GR              GR          DO          GR
DNP.FNP     GR          UG              DO          GR          UG

我想忽略所有NULL值,并且我想忽略Program1、2和3字段中的任何“ GR”,“ UG”或“ DO”,因为它们不是有效的程序ID。它们仅应在此处用于确定该计划的学术水平。

最终目标是识别一个程序。如果有一个本科课程,那一定是那个课程。如果没有本科课程,则必须是研究生课程。如果没有研究生课程,则为博士课程。如果有2个本科课程,我不在乎其中哪一个。同样,如果有2个研究生课程(而没有本科课程),则任何一个都足够。

我面临的挑战之一是在三列中如何“布局”程序有很多可能性……没有特定的顺序或顺序。

再次感谢您的帮助/指导,对于先前的混乱也深表歉意。

######################更新

以下是我要完成的工作的一个示例:

CASE WHEN ISNULL(Program2,'')='' THEN Program1
       WHEN (AcadLevel1 = 'UG' and Program1 NOT IN ('UG','SP','GR','DO')) THEN Program1
       WHEN (AcadLevel1 = 'UG' and Program1 IN ('UG','SP','GR','DO')) THEN
        CASE WHEN ISNULL(Program2,'')='' THEN Program1 
             WHEN Program2 IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')='' THEN Program2
             WHEN Program2 IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')<>'' THEN Program3
             WHEN Program2 IN ('UG','SP','GR','DO') AND Program3 IN ('UG','SP','GR','DO') THEN Program1
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')='' THEN Program2
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND AcadLevel2 = 'UG' THEN Program2
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND AcadLevel3 = 'UG' AND Program3 NOT IN ('UG','SP','GR','DO') THEN Program3
             ELSE 'Other'
        END
 ELSE 'Other2' 
END AS 'Program_New'

我很难分析所有字段之间的每种可能情况以获取正确的程序值。虽然我可以继续编写其他CASE语句,直到没有任何“其他”错误代码为止,但我仍然不一定知道它们是否解决了所有可能的情况。

我希望有一个更全面,更简单的解决方案,但也许没有...

2 个答案:

答案 0 :(得分:0)

您是否正在寻找类似的东西?

DECLARE @table TABLE (id INT, program1 VARCHAR(10), program2 VARCHAR(10), program3 VARCHAR(10));
INSERT INTO @table 
SELECT 1, 'MBA', 'ABM', 'XYZ'
UNION ALL
SELECT 2, 'QWE', 'MBA', 'ABM';

SELECT
    id,
    CASE
        WHEN program1 = 'MBA' THEN 'program1'
        WHEN program2 = 'MBA' THEN 'program2'
        WHEN program3 = 'MBA' THEN 'program3'
        ELSE 'not found'
    END AS result
FROM
    @table;

结果:

id  result
1   program1
2   program2

因此,您想从第一个查询中获取结果,然后将其输入第二个查询中,在该查询中对结果进行其他处理。是的,这是可能的,但是我真的不确定您要怎么处理,例如:

DECLARE @table TABLE (id INT, program1 VARCHAR(10), program2 VARCHAR(10), program3 VARCHAR(10));
INSERT INTO @table 
SELECT 1, 'MBA1', 'ABM', 'XYZ'
UNION ALL
SELECT 2, 'QWE', 'MBA2', 'ABM';

WITH x AS (
    SELECT
        id,
        CASE
            WHEN program1 LIKE '%MBA%' THEN 'program1'
            WHEN program2 LIKE '%MBA%' THEN 'program2'
            WHEN program3 LIKE '%MBA%' THEN 'program3'
            ELSE 'not found'
        END AS result
    FROM
        @table)
SELECT
    *,
    CASE
        WHEN result = 'program1' THEN t.program1
        WHEN result = 'program2' THEN t.program2
        WHEN result = 'program3' THEN t.program3
    END AS not_sure_where_you_are_going_with_this
FROM
    x
    INNER JOIN @table t ON t.id = x.id;

我的示例是垃圾顺便说一句,因为您可以在单个查询中轻松完成所有这些操作。因此,我认为您需要提供一些数据/预期结果才能获得更好的答案?

答案 1 :(得分:0)

您需要使用case检查每一列,并使用like检查该列是否包含值MBA

select
    case
      when program1 like '%MBA%' then program1
      when program2 like '%MBA%' then program2
      when program3 like '%MBA%' then program3
    end col 
from tablename

请参见here