Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL语句中定义一个CASE(需要简化)_Sql_Sql Server_Case - Fatal编程技术网

在SQL语句中定义一个CASE(需要简化)

在SQL语句中定义一个CASE(需要简化),sql,sql-server,case,Sql,Sql Server,Case,SQL语句(SQL Server)可以工作,但它非常冗余,而且效率似乎很低。我想知道是否有一种方法可以在SELECT语句中定义case语句,然后创建条件语句 我从一个表中提取信息,抓取主键INT ID并检查该ID是否存在于另一个表中。如果没有,则指定一个0值-但如果它确实获取ID,则重复相同的过程以检查另一个表 有人能解释一下如何简化这句话吗 SELECT a.[ID] AS ID, a.[JOB_NUMBER] AS JOB_NUMBER, -- Test to

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  
);
这似乎很愚蠢:

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子句中使用逗号。

这似乎很愚蠢:

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
语法。不要在<代码>中使用逗号从子句。

< P>你应该考虑声明变量并在查询中使用它,类似这样的事情:

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  
);

在语句之前设置变量<强>必须/<强>,这并不总是取决于您如何执行查询。

< P>您应该考虑声明变量并在查询中使用它,例如:

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  
);

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

同意。这很愚蠢,我确实纠正了你的错误。但有没有办法将“JOB_LINKS”分配给一个变量,这样我就不必在下一个案例陈述中再次检查它了?同意。这很愚蠢,我确实纠正了你的错误。但是有没有一种方法可以将“JOB_LINKS”分配给一个变量,这样我就不必在下一个CASE语句中再次检查它了?