CASE WHEN用于定义类型

时间:2019-06-19 07:18:46

标签: sql sql-server

我的观点向我展示了我的组织结构。我现在想通过在几个不同的表中搜索匹配项来为每个记录定义一个类型。

我正在建立一个向您展示组织结构的网页。为简化起见,我想根据记录的类型对事物进行颜色编码。如果是分区,我希望它是绿色,单位是红色,依此类推。我想到了对不同的表使用CASE WHEN和LEFT JOIN来“查找匹配项”,然后设置类型。有什么想法吗?在下面的代码中,您看到了我的起点。这向我显示了结构中的不同记录及其所在的级别。但是我可以在同一级别上进行几项不同的操作,因此我也想定义类型。

SELECT ID
        ,BelongTo_ID
        ,Name
        ,IdPath
        ,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
        ,CASE WHEN EXISTS (SELECT * FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK) WHERE BelongTo_ID = OS.ID) 
            THEN 0 ELSE 1 END AS IsEndpoint
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)

我有一个带有org结构的工作视图,但是现在我想设置类型。我想根据找到记录的表来设置类型。如果在“分区”表中找到它,则将类型设置为1,在“单位”表中找到它,然后将类型设置为2,依此类推。

样本记录:

Sample Records

2 个答案:

答案 0 :(得分:0)

您可以按以下方式使用LEFT JOIN和CASE / WHEN-

SELECT ID
,BelongTo_ID
,Name
,IdPath
,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
,CASE 
    WHEN  A.BelongTo_ID IS NOT NULL  THEN 'Red'
    WHEN  B.<related column> IS NOT NULL  THEN 'Green'
    WHEN  C.<related column> IS NOT NULL  THEN 'Blue'
    ELSE 1 
END AS IsEndpoint
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)
LEFT JOIN (
    SELECT DISTINCT BelongTo_ID FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK)
) A ON OS.ID  =  A.BelongTo_ID

LEFT JOIN (
    ...
) B ON OS.ID  =  B.<related column>

LEFT JOIN (
    ...
) C ON OS.ID  =  C.<related column>

答案 1 :(得分:0)

假设该记录仅在其中一个表中一次。...

;WITH cte_Common_Types AS (
    SELECT 'Division' AS TypeName, 'Green' AS TypeColor, ID
    FROM atbl_Common_Divisions
    UNION ALL
    SELECT 'Unit' AS TypeName, 'Red' AS TypeColor, ID
    FROM atbl_Common_Units
)
SELECT 
    ID
    ,BelongTo_ID
    ,Name
    ,IdPath
    ,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
    ,CASE WHEN EXISTS (SELECT 1 FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK) WHERE BelongTo_ID = OS.ID) 
            THEN 0 ELSE 1 END AS IsEndpoint
    ,TypeName
    ,TypeColor
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)
LEFT JOIN cte_Common_Types CT ON OS.ID = CT.ID