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