代码之家  ›  专栏  ›  技术社区  ›  bagofmilk

在SQL语句中定义案例(需要简化)

  •  0
  • bagofmilk  · 技术社区  · 6 年前

    SQL语句(SQL Server)可以工作,但它是非常多余的,而且似乎效率很低。我想知道是否有一种方法可以在select中定义case语句,然后创建条件语句。

    我从一个表中提取信息,获取主键int id并检查该id是否存在于另一个表中。如果没有,那么分配一个0值-但是如果它确实获取了ID,那么我重复相同的过程来检查另一个表。

    有人能解释一下如何简化这个说法吗?

    SELECT 
        a.[ID] AS ID, 
        a.[JOB_NUMBER] AS JOB_NUMBER, 
    
        -- Test to see if we have any entries in job_links_data, if not then assign 0
        CASE WHEN
           (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID])) = 0
        THEN 0
        ELSE
           (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID]))  
        END AS JOB_LINKS,
    
        -- If above is 0, then assign an empty string '' - else grab the title
        CASE WHEN
           (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID])) = 0
        THEN  ''
        ELSE
           (SELECT c.[TITLE] FROM 
                job_links_info c, 
                job_links_data b, 
                tbl_jobs a 
            WHERE (b.[JOB_LINK_INFO_ID]=c.[ID] AND b.[JOB_ID]=a.[ID]))
        END AS TITLE
    
    FROM tbl_jobs a
    WHERE (
        a.[PROJECT_ID]=25  
    );
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Johwhite Rady    6 年前

    您应该考虑声明一个变量并在查询中使用它,如下所示:

    DECLARE @JOB_LINKS int
    SET @JOB_LINKS = (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID]))
    
    -- And after this, your query with the variable.
    
    SELECT 
        a.[ID] AS ID, 
        a.[JOB_NUMBER] AS JOB_NUMBER, 
        @JOB_LINKS AS JOB_LINKS,
    
        CASE WHEN @JOB_LINKS = 0
        THEN  ''
        ELSE -- selecting the title only when job links is not 0
           (SELECT c.[TITLE] FROM 
                job_links_info c, 
                job_links_data b, 
                tbl_jobs a 
            WHERE (b.[JOB_LINK_INFO_ID]=c.[ID] AND b.[JOB_ID]=a.[ID]))
        END AS TITLE
    
    FROM tbl_jobs a
    WHERE (
        a.[PROJECT_ID]=25  
    );
    

    变量 必须 在语句之前设置,这并不总是可能的,这取决于您执行查询的方式。

        2
  •  1
  •   Gordon Linoff    6 年前

    这看起来很愚蠢:

    CASE WHEN
       (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID])) = 0
    THEN 0
    ELSE
       (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID]))  
    END AS JOB_LINKS,
    

    如果值为0,则分配0?替换为:

    (SELECT COUNT([ID]) FROM job_links_data WHERE ([JOB_ID]=a.[ID]))  AS JOB_LINKS
    

    我也建议你使用适当的,明确的, 标准 JOIN 语法。 从未 在中使用逗号 FROM 条款。