有条件地从映射表中替换选择值

时间:2013-11-20 13:15:23

标签: tsql

如果值与查找表中的值匹配,我想在SELECT语句中替换值。这是为了处理从子项到父项的映射。

DECLARE @Mappings TABLE 
(
    IdKey INT IDENTITY PRIMARY KEY ,
    ParentModule NVARCHAR(255) , 
    ChildModule NVARCHAR(255) 
)

这是用子模块及其父模块填充的,将有大约200个这样的映射。

然后在我的SELECT语句中,我想使用ParentModule而不是Child,但如果子项不匹配,则使用任何已选择的值。

SELECT  DISTINCT
        RTRIM(StudentId) ,
        ISNULL(( RTRIM(AOSCode) + '_' + RTRIM(AOSPeriod) ), '') AS Module 
FROM    Curriculum

我要与ChildModule进行比较的值是(RTRIM(AOSCode) + '_' + RTRIM(AOSPeriod))。所以,如果匹配,我希望select返回@Mappings ParentModule,否则返回AOSCode_AOSPeriod连接返回的值

SELECT用于INSERT INTO语句......

1 个答案:

答案 0 :(得分:1)

试试这个:

SELECT DISTINCT
        RTRIM(StudentId) ,
        ISNULL(Map.ParentModule,ISNULL((RTRIM(AOSCode) + '_' + RTRIM(AOSPeriod)), '')) AS Module 
FROM 
    Curriculum AS Cr 
    LEFT JOIN @Mappings AS Map ON 
        ((RTRIM(Cr.AOSCode) + '_' + RTRIM(Cr.AOSPeriod)) = Map.ChildModule;

您将与RTRIM(AOSCode) + '_' + RTRIM(AOSPeriod)一起加入表达式ChildModule。如果匹配,您将显示ParentModule。否则,您将显示ISNULL(( RTRIM(AOSCode) + '_' + RTRIM(AOSPeriod) ), '')

请注意,我无法从您的数据中决定是否必须在联接中的表达式中使用ISNULL