Случай, когда существует, затем выберите - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть требование выбрать поле из таблицы в условии 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

1 Ответ

1 голос
/ 22 сентября 2011

Понятия не имею, как будет выглядеть остальная часть вашего кода, но обычно это будет:

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;

Но кроме общей идеи, вы не дали достаточно информации, чтобы дать полный ответ.

...