感谢您对发布的说明。我试图使其保持简单,但是这里有一些其他细节/深度可以帮助我实现目标。
基本上,我想搜索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语句,直到没有任何“其他”错误代码为止,但我仍然不一定知道它们是否解决了所有可能的情况。
我希望有一个更全面,更简单的解决方案,但也许没有...
答案 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