【问题标题】:Case when exists then select存在时的情况然后选择
【发布时间】:2011-11-22 06:32:34
【问题描述】:

我需要在 case 语句中从表中选择字段,而不是一些静态值。

WHEN EXISTS(SELECT c.customer_name FROM Sales.Customer AS c 
            WHERE c.PersonID = @BusinessEntityID) 

           THEN c.customer_name  

这是如何实现的,或者这是否可能。我从 msdn 站点获取了以下内容。需要调整以满足我的要求。

USE AdventureWorks2008R2;
GO
CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID int)
RETURNS @retContactInformation TABLE 
(
BusinessEntityID int NOT NULL,
FirstName nvarchar(50) NULL,
LastName nvarchar(50) NULL,
ContactType nvarchar(50) NULL,
PRIMARY KEY CLUSTERED (BusinessEntityID ASC)
) 
AS 
-- Returns the first name, last name and contact type for the specified contact.
BEGIN
DECLARE 
    @FirstName nvarchar(50), 
    @LastName nvarchar(50), 
    @ContactType nvarchar(50);

-- Get common contact information
SELECT 
    @BusinessEntityID = BusinessEntityID, 
    @FirstName = FirstName, 
    @LastName = LastName
FROM Person.Person 
WHERE BusinessEntityID = @BusinessEntityID;

SET @ContactType = 
    CASE 
        -- Check for employee
        WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e 
            WHERE e.BusinessEntityID = @BusinessEntityID) 
            THEN 'Employee'

        -- Check for vendor
        WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec
            WHERE bec.BusinessEntityID = @BusinessEntityID) 
            THEN 'Vendor'

        -- Check for store
        WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v          
            WHERE v.BusinessEntityID = @BusinessEntityID) 
            THEN 'Store Contact'

        -- Check for individual consumer
        WHEN EXISTS(SELECT * FROM Sales.Customer AS c 
            WHERE c.PersonID = @BusinessEntityID) 
            THEN 'Consumer'
    END;

-- Return the information to the caller
IF @BusinessEntityID IS NOT NULL 
BEGIN
    INSERT @retContactInformation
    SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;
END;

RETURN;
END;
GO

【问题讨论】:

  • 当客户不存在时你想返回什么?没有行NULL?其他价值?
  • 您需要设置一个变量,如代码示例中那样,还是您的 CASE 语句在查询中?
  • 为什么我们需要猜这个问题?
  • 同意上面的评论。也许达尼洛明白你想要什么,但我绝对不明白。这个问题需要更多地解释您的需求。随意输入一些 MSDN 代码 sn-p 并没有真正的帮助。
  • 我可以使这个查询工作。抱歉,如果不清楚...简单的问题是,当您将 CASE 与 exists 子句一起使用时,您是否可以访问在 exists 子句后 then 子句中检索到的字段。答案是不。你们几个downvoters 太我的声誉 4 点,并没有回答任何问题。 -- 检查员工 WHEN EXISTS(SELECT e.field1 FROM HumanResources.Employee AS e WHERE e.BusinessEntityID = @BusinessEntityID) THEN field1 ----field1 不能在此处访问。

标签: tsql sql-server-2000


【解决方案1】:

不知道你的代码的其余部分是什么样的,但通常是这样的:

SELECT name = COALESCE(c.customer_name, o.other_entity_name)
  FROM dbo.MainEntity AS m
  LEFT OUTER JOIN dbo.Customers  AS c ON m.something = c.something
  LEFT OUTER JOIN dbo.OtherTable AS o ON m.something = o.something;

但是除了一般的想法之外,您还没有提供足够的信息来提供完整的答案。

【讨论】:

  • 我认为除了这里给出的例子之外不需要知道任何东西。但是您查询肯定会有所帮助并提供另一种见解。谢谢
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多