我正在尝试为SSRS中的一个参数编写一个查询,如果它没有拉回任何数据,它将在参数中放入"None“。以下是我尝试过的方法:
select CASE
WHEN pt.propertynumber IS NOT NULL
THEN pt.propertynumber
ELSE 'None'
END AS "Field1"
from projectmaintenanceproperties pmp
left join projectmaintenances pm on pm.id = pmp.projectmaintenanceid
left join properties pt on pt.id = pmp.propertyid
where pm.id in (:Ops)
and pt.projectid in ( :Proj )
order by 1
当没有回调数据时,它不会在Field1中返回任何内容。
我怎么告诉它返回'None‘呢?
发布于 2021-04-02 17:34:25
哦,评论是正确的-是我的错。相反,您将需要一个IF语句来检查是否返回了任何值:
IF EXISTS
( select CASE
WHEN pt.propertynumber IS NOT NULL
THEN pt.propertynumber
ELSE 'None'
END AS "Field1"
from projectmaintenanceproperties pmp
left join projectmaintenances pm on pm.id = pmp.projectmaintenanceid
left join properties pt on pt.id = pmp.propertyid
where pm.id in (:Ops)
and pt.projectid in ( :Proj )
order by 1;
)
THEN select pt.propertynumber [Field1]
from projectmaintenanceproperties pmp
left join projectmaintenances pm on pm.id = pmp.projectmaintenanceid
left join properties pt on pt.id = pmp.propertyid
where pm.id in (:Ops)
and pt.projectid in ( :Proj )
order by 1;
ELSE
SELECT 'None' AS [Field1];
END IF;
发布于 2021-04-02 18:29:42
好吧,这是一个噩梦,也许能解决这个问题。我之所以做这个噩梦,是因为我曾经有一个查询非常巧妙地使用了UNION和NOT EXISTS来返回一个完全不同的查询,并且在执行第二个查询时导致了一个灾难性的查询计划。
我在下面做的是使用一个假的左外部连接,这个表只有一行到您想要的值表。它是假的,因为连接谓词总是真的。因此,对于查询中的每一行,也将返回ForNone查询中的列,但是会被忽略,因为coalesce将返回查询中的值(除非它为null,如果有可能,您可以在查询中添加检查)。如果您的查询没有结果,则只返回一行,因为and coalesce将使用值'None‘。
SELECT COALESCE(src.Field1, ForNone.NoneField) AS "Field1"
FROM ( SELECT 'None' AS "NoneField" ) ForNone
LEFT OUTER JOIN (
select pt.propertynumber AS "Field1"
from projectmaintenanceproperties pmp
left join projectmaintenances pm on pm.id = pmp.projectmaintenanceid
left join properties pt on pt.id = pmp.propertyid
where pm.id in (:Ops)
and pt.projectid in ( :Proj )
order by 1
) src ON 1 = 1
https://stackoverflow.com/questions/66923000
复制相似问题