Если тогда логика для вставки запросов в столбцы запроса в преобразованиях - PullRequest
0 голосов
/ 06 сентября 2018

У нас есть преобразования для нашей интеграции ERP / CRM.Мы можем жестко запрограммировать преобразование или использовать таблицы поиска.Теперь мы должны закомментировать один метод, так как обзор таблицы закомментирован ниже.Но нам нужно проверить жесткий код, а затем, если преобразование не найдено в жестком коде, нам нужно найти таблицы соответствия на предмет соответствия.Пример одного столбца приведен ниже.Нам нужно что-то вроде, если не найден в преобразовании жесткого кода поиска в таблицах.SQL SERVER 2008R

,
           --degree = PC.UCURRICULM, --transformation hard coded
           curriculum = CASE PC.UMAJOR

            WHEN 'ACM' then 'ACCT'
            WHEN 'BSBA' then 'BADM'
            WHEN 'B&TS' then 'BIBT'
            WHEN 'BICH' then 'BIOC'
            WHEN 'BIO' then 'BIOL'
            WHEN 'BIS' then 'BIS'
            WHEN 'BCOM' then 'Bu Com'
            WHEN 'BUS' then 'BUSI'
            WHEN 'CHEM' then 'CHEM'
            WHEN 'AASCM' then 'CHRM'
            WHEN 'CL&A' then 'CLDA'
            WHEN 'COM' then 'COMM'
            WHEN 'CRIM' then 'CRIM'
            WHEN 'CRMJ' then 'CRMJ'
            WHEN 'CROS' then 'CROSS'
            WHEN 'DIGC' then 'DIGCIN'
            WHEN 'MED' then 'EDUC'
            WHEN 'EDES' then 'ELED'
        END
        /*
        --Transformation lookup on tables
        ,(SELECT TOP 1 ISNULL(CC.CODE_VALUE_KEY, '') FROM Bridge_test.dbo.peoplechanges pc 
                        LEFT JOIN [sis_test].[dbo].[CODE_CURRICULUM] CC ON CC.[CODE_VALUE] = PC.[UMAJOR]
        */

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Вы можете попытаться создать таблицу mapperTable вместо HardCode CASE WHEN, чтобы код стал чище.

, в будущем вам просто нужно поддерживать таблицу mapperTable.

CREATE TABLE mapperTalbe(
   UMAJOR varchar(50),
   curriculum varchar(50)
);

INSERT INTO mapperTalbe VALUES ('ACM' , 'ACCT');
INSERT INTO mapperTalbe VALUES ('BSBA' , 'BADM');
INSERT INTO mapperTalbe VALUES ('B&TS' , 'BIBT');
INSERT INTO mapperTalbe VALUES ('BICH' , 'BIOC');
INSERT INTO mapperTalbe VALUES ('BIO' , 'BIOL');
INSERT INTO mapperTalbe VALUES ('BIS' , 'BIS');
INSERT INTO mapperTalbe VALUES ('BCOM' , 'Bu Com');
INSERT INTO mapperTalbe VALUES ('BUS' , 'BUSI');
INSERT INTO mapperTalbe VALUES ('CHEM' , 'CHEM');
INSERT INTO mapperTalbe VALUES ('AASCM' , 'CHRM');
INSERT INTO mapperTalbe VALUES ('CL&A' , 'CLDA');
INSERT INTO mapperTalbe VALUES ('COM' , 'COMM');
INSERT INTO mapperTalbe VALUES ('CRIM' , 'CRIM');
INSERT INTO mapperTalbe VALUES ('CRMJ' , 'CRMJ');
INSERT INTO mapperTalbe VALUES ('CROS' , 'CROSS');
INSERT INTO mapperTalbe VALUES ('DIGC' , 'DIGCIN');
INSERT INTO mapperTalbe VALUES ('MED' , 'EDUC');
INSERT INTO mapperTalbe VALUES ('EDES' , 'ELED');

CREATE TABLE T (UMAJOR varchar(50));

INSERT INTO T VALUES ('EDES');
INSERT INTO T VALUES ('CRIM');
INSERT INTO T VALUES ('CRIM1');

Запрос 1 :

SELECT t2.UMAJOR
FROM T t1
LEFT JOIN mapperTalbe t2 on t1.UMAJOR = t2.UMAJOR

Результаты :

| UMAJOR |
|--------|
|   CRIM |
|   EDES |
| (null) |
0 голосов
/ 06 сентября 2018

Просто добавьте подзапрос к case в предложении else:

,
           --degree = PC.UCURRICULM, --transformation hard coded
           curriculum = CASE PC.UMAJOR    
            WHEN 'ACM' then 'ACCT'
            WHEN 'BSBA' then 'BADM'
            WHEN 'B&TS' then 'BIBT'
            WHEN 'BICH' then 'BIOC'
            WHEN 'BIO' then 'BIOL'
            WHEN 'BIS' then 'BIS'
            WHEN 'BCOM' then 'Bu Com'
            WHEN 'BUS' then 'BUSI'
            WHEN 'CHEM' then 'CHEM'
            WHEN 'AASCM' then 'CHRM'
            WHEN 'CL&A' then 'CLDA'
            WHEN 'COM' then 'COMM'
            WHEN 'CRIM' then 'CRIM'
            WHEN 'CRMJ' then 'CRMJ'
            WHEN 'CROS' then 'CROSS'
            WHEN 'DIGC' then 'DIGCIN'
            WHEN 'MED' then 'EDUC'
            WHEN 'EDES' then 'ELED'
            else -- Transformation lookup on tables.
              ( SELECT TOP 1 ISNULL(CC.CODE_VALUE_KEY, '') FROM Bridge_test.dbo.peoplechanges pc 
                 LEFT JOIN [sis_test].[dbo].[CODE_CURRICULUM] CC ON CC.[CODE_VALUE] = PC.[UMAJOR] )
            end

Совет: Хорошей практикой является включение предложения else в целом. Даже если он возвращает null, это показывает, что вы приняли осознанное решение о том, как обрабатывать «другие» значения.

0 голосов
/ 06 сентября 2018

Используйте этот (сокращенный для ясности) код:

coalesce(
    case PC.UMAJOR when ... end, -- case returns null if no hit
    (SELECT TOP 1 ISNULL(CC.CODE_VALUE_KEY, '') FROM Bridge_test.dbo.peoplechanges pc 
                    LEFT JOIN [sis_test].[dbo].[CODE_CURRICULUM] CC ON CC.[CODE_VALUE] = PC.[UMAJOR]
)

coalesce() возвращает первое ненулевое значение в своем списке параметров.Случай вернет ноль, если совпадений нет, и в этом случае будет возвращен выбор из таблицы поиска.

Используя COALESCE, который принимает любое количество параметров, вы можете добавить еще один уровеньбезопасность путем предоставления третьего значения для объединения в случае, если подзапрос возвращает ноль (что произошло бы, если бы peoplechanges было пустым):

coalesce(
    case PC.UMAJOR when ... end, -- case returns null if no hit
    (SELECT TOP 1 ....),
    'some default'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...