Сортировка / Рейтинг | ЕСЛИ в подзапросе? - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь написать процедуру, которая будет возвращать контактные данные для нескольких человек в зависимости от типа учетной записи.

Я использую if и unions для получения данных, однако я также хочу заказать запрос в proc, но я не уверен в лучшем методе.

Вот мой запрос:

    SELECT Name, Type, RecipientId FROM (
IF(@EntityType = 'Tenant')
BEGIN


SELECT
    c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
    'Tenant' AS [Type],
    tc.TenantId AS [RecipientId],
    1 AS DisplayOrder
FROM
    Tenant.Account tc
WHERE
    tc.AccountId = @EntityId

UNION

SELECT
    c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
    tc.Relationship AS [Type],
    tc.ContactId AS [RecipientId],
    2 AS DisplayOrder
FROM
    Tenant.Contacts tc
JOIN
    General.Contact c ON tc.ContactId = c.ContactId
WHERE
    tc.ContactId = @EntityId
END

IF(@EntityType = 'Landlord')
BEGIN


SELECT
    c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
    'Landlord' AS [Type],
    tc.LandlordId AS [RecipientId],
    2 AS DisplayOrder
FROM
    Landlords.Account tc
WHERE
    tc.LandlordId = @EntityId

UNION

SELECT
    c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
    tc.Relationship AS [Type],
    tc.ContactId AS [RecipientId],
    1 AS DisplayOrder
FROM
    Landlords.Contacts tc
JOIN
    General.Contact c ON tc.ContactId = c.ContactId
WHERE
    tc.ContactId = @EntityId
END) a 

 ORDER BY a.DisplayOrder

Это вызывает ошибку при использовании IF в подзапросе, поэтому любые предложения приветствуются, так как это очень длинный запрос, в котором необходимость заказа отображения из proc только что стала требованием.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Вы можете SORT Набор результатов внутри оператора IF.

Попробуйте вот так:

IF(@EntityType = 'AccountType1')
BEGIN
    SELECT Name, Type, RecipientId 
    FROM (      
            SELECT
                c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
                tc.Relationship AS [Type],
                tc.ContactId AS [RecipientId],
                1 AS DisplayOrder
            FROM
                Temp.Contacts tc
            JOIN
                General.Contact c ON tc.ContactId = c.ContactId
            WHERE
                tc.ContactId = @EntityId

            UNION

            SELECT
                c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
                tc.Relationship AS [Type],
                tc.ContactId AS [RecipientId],
                2 AS DisplayOrder
            FROM
                All.Contacts tc
            JOIN
                General.Contact c ON tc.ContactId = c.ContactId
            WHERE
                tc.ContactId = @EntityId
    )A
    ORDER BY A.DisplayOrder
END

IF(@EntityType = 'AccountType2')
BEGIN
    SELECT Name, Type, RecipientId 
    FROM (      
        SELECT
            c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
            tc.Relationship AS [Type],
            tc.ContactId AS [RecipientId],
            2 AS DisplayOrder
        FROM
            Temp.Contacts tc
        JOIN
            General.Contact c ON tc.ContactId = c.ContactId
        WHERE
            tc.ContactId = @EntityId

        UNION

        SELECT
            c.Title + ' ' + c.FirstName + ' ' + c.LastName AS Name,
            tc.Relationship AS [Type],
            tc.ContactId AS [RecipientId],
            1 AS DisplayOrder
        FROM
            All.Contacts tc
        JOIN
            General.Contact c ON tc.ContactId = c.ContactId
        WHERE
            tc.ContactId = @EntityId
    )A
    ORDER BY A.DisplayOrder
END
0 голосов
/ 24 апреля 2018

Если я правильно понял, оба запроса совпадают, единственное отличие - DisplayOrder.

Просто используйте один SELECT и замените 1 AS DisplayOrder на

CASE WHEN @EntityType = 'AccountType1' THEN 1 ELSE 2 END AS DisplayOrder

И во втором случае вы принимаете это как-то иначе

CASE WHEN @EntityType = 'AccountType1' THEN 2 ELSE 1 END AS DisplayOrder

Нет необходимости в IF в этом случае ...

Редактировать и обновлять ...

Пришлось исправить опечатку ...

Если у вас больше этих двух типов, вы можете использовать другой CASE синтаксис

CASE @EntityType WHEN 'a' THEN 1
                 WHEN 'b' THEN 2
                 ... add more ...
                 ELSE 99 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...