如何编写if exist语句,该语句将根据是否存在运行不同的select

时间:2019-05-21 15:05:08

标签: sql reporting-services dynamics-crm

我正在尝试将sql if exists语句转换为SSRS有效格式,以便在CRM上运行报告。

如果我使用if exists方法,CRM报告将不接受上载的报告,我在确定自己可以使用的位置时遇到了麻烦。

IF EXISTS(select * from dbo.FC where dbo.FC.ContactID in (select dbo.AV.so_contactid from dbo.AV))
begin
    select [STATEMENT 1]
    from dbo.AV CRMAF_so_AV join
         dbo.FC c 
        on CRMAF_so_AV.so_contactid = c.ContactID;
end
else
begin
    select [STATEMENT 2]
    from dbo.AV CRMAF_so_AV join
         dbo.FA c
         on CRMAF_so_AV.so_contactid = c.AccountID;

end;

如果条件为真,我希望能够运行select [STATEMENT 1],否则我想运行select [STATEMENT 2]

5 个答案:

答案 0 :(得分:1)

我设法通过执行LEFT JOIN而不是JOIN来使其工作。

select [STATEMENT 1 + 2 all columns needed]
from dbo.AV CRMAF_so_AV 
left join dbo.FC c on CRMAF_so_AV.so_contactid = c.ContactID;
left join dbo.FA a on CRMAF_so_AV.so_contactid = a.AccountID;

现在可以运行,如果它是一个帐户或联系人。

答案 1 :(得分:0)

尝试一下-

您必须将整个语句放在@select1@select1中。

declare @statement1 as varchar(max);
declare @statement2 as varchar(max);

SET @statement1 = 'SELECT 1'
SET @statement2 = 'SELECT 2'

IF EXISTS(select * from dbo.FC where dbo.FC.ContactID in (select dbo.AV.so_contactid from dbo.AV))

    BEGIN
        EXEC (@statement1)
    END

ELSE 

    BEGIN
        EXEC (@statement2)
    END

答案 2 :(得分:0)

我认为您需要这样的东西:

WITH PreSelection AS (
  SELECT 
    AV.ID AS AVID, 
    (SELECT TOP(1) c.ContactID FROM dbo.FC c WHERE c.ContactID = AV.so_contactid) AS ContactID, 
    (SELECT TOP(1) c.ContactID FROM dbo.FA c WHERE c.AccountID = AV.so_contactid) AS AccountID 
  FROM dbo.AV
)

SELECT
  AVID,
  ISNULL(
    CASE WHEN ContactID IS NULL 
    THEN (SELECT TOP(1) AccountName FROM dbo.FA WHERE FA.AccountID = AccountID)
    ELSE (SELECT TOP(1) LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + ISNULL(LastName, ''))) FROM dbo.FC WHERE FC.ContactID = ContactID)
    END, '') AS ContactName
FROM PreSelection

答案 3 :(得分:0)

除了使用if存在之外,您还无法获得满足条件的记录计数,然后如果其1或更大的记录运行与0相等的查询。

让我知道我是否缺少您想要达到的目标。

抱歉,由于拥有新帐户,我无法发表评论,所以我的声誉很低。

答案 4 :(得分:0)

一些注意事项: 当SSRS评估查询时,它期望结果表示列名称和类型始终具有相同的结构。

所以您不能做这样的事情。

IF @x=@y
    BEGIN
        SELECT Name, Age FROM employees
    END
ELSE
    BEGIN
        SELECT DeptID, DeptName, DeptEMpCOunt FROM departments
    END

...,因为这将返回不同的类型和列名称以及列计数。

这是您可以做的。

DECLARE @t TABLE(resultType int, colA varchar(128), colB int, colC varchar(128), colD int)
IF @x=@y
    BEGIN
        INSERT INTO @t(resultType, colA, ColB)
        SELECT 1 as resultType, Name, Age FROM employees
    END
ELSE
    BEGIN
        INSERT INTO @t(resultType, colB, colC, colD)
        SELECT 2 AS resultType, DeptID, DeptName, DeptEmpCount FROM departments
    END

SELECT * FROM @t

我们正在做的是创建一个表,该表可以处理数据的所有变体,并将结果放入可以容纳该数据类型的任何列中。

这将始终返回相同的数据结构,因此SSRS会感到满意,然后您将需要根据返回的内容来处理从哪些列显示数据,因此为什么在结果中添加结果类型以便进行测试在报告中。