Могу ли я использовать производный столбец на сервере SQL для выполнения функции CASE? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть «основная» таблица C1, в которой есть идентификатор записи, который, в свою очередь, может быть связан либо с учетной записью, либо с идентификатором клиента. Связь / связь хранится в двух отдельных таблицах, одна с идентификатором записи - отношения на уровне учетной записи, а другая - с идентификатором записи - взаимосвязью на уровне клиента. Записи C1 могут иметь отношения как с учетной записью, так и с клиентами.

Я пытаюсь создать соединение, чтобы привести отношения в одно аккуратное представление, где я ищу следующий результат:

ID         ---- LINKAGE --- REL_TYPE
C1 Record ID --- ABC123 --- ACCOUNT
C1 Record ID --- 1235 ---- CUSTOMER
C1 Record ID --- NULL ---- UNLINKED

Как мы надеемся, ясно из вышеизложенного, учетная запись - это буквенно-цифровая c, а идентификатор клиента - числовой c. Я использую это в моем COALESCE для получения столбца LINKAGE, который не существует сам по себе.

Мой код сейчас выглядит так:

SELECT 
     C1.ID,
     C1.Name,
     COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
     CASE 
        WHEN LINKAGE LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS varchar(255))
        WHEN LINKAGE LIKE '10%' THEN CAST('CUSTOMER' AS varchar(255))
        ELSE 'Unlinked'
     END AS REL_TYPE

FROM C1

LEFT JOIN C2 ON C1.ID = C2.ID
LEFT JOIN C3 ON C1.ID = C3.ID

Синтаксически код выглядит отлично на SQL сервере в том, что я не получаю никаких ошибок, но когда я выполняю, я получаю сообщение об ошибке, что 'LINKAGE' не существует как столбец - это не так, но не сообщит ли объединение компилятору что связь является основой для функции case?

Пожалуйста, дайте мне знать, если требуется дополнительная ясность.

Ура, SQLGeekInTraining

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

SQL Сервер позволяет использовать ключевое слово APPLY для определения псевдонимов столбцов в предложении FROM. Это упростит ваш лог. c:

SELECT C1.ID, C1.Name, v.LINKAGE,
       (CASE WHEN v.LINKAGE LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS varchar(255))
             WHEN v.LINKAGE LIKE '10%' THEN CAST('CUSTOMER' AS varchar(255))
             ELSE 'Unlinked'
        END) AS REL_TYPE
FROM C1 LEFT JOIN
     C2
     ON C1.ID = C2.ID LEFT JOIN
     C3 
     ON C1.ID = C3.ID CROSS APPLY
     (VALUES (COALESCE(C2.ACC_ID, C3.CUSTOMER_ID))) v(LINKAGE);

CAST() в выражении CASE кажется лишним, если вы не намерены сохранить результат в таблице и не хотите четко указывать тип .

0 голосов
/ 12 июля 2020

Пожалуйста, используйте запрос ниже. Вы не можете использовать LINKAGE в операторе case, поскольку это псевдоним, а не исходный столбец базы данных. Вы должны использовать фактическое имя столбца вместе с функцией вместо имени псевдонима

SELECT 
   C1.ID,
   C1.Name,
   COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
   CASE 
     WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS 
     varchar(255))
     WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '10%' THEN CAST('CUSTOMER' AS 
     varchar(255))
    ELSE 'Unlinked'
 END AS REL_TYPE

FROM C1

LEFT JOIN C2 ON C1.ID = C2.ID
LEFT JOIN C3 ON C1.ID = C3.ID
...