Автоматическое сопоставление строковых шаблонов в SSIS - PullRequest
0 голосов
/ 04 июля 2018

Мой клиент хочет классифицировать столбец свободного текста в одной из своих таблиц, распознавая определенный строковый шаблон ('AAA', 'BBB', ...) в имени поля столбца. Они предоставили мне запрос для классификации:

SELECT  [Column],
CASE 
 WHEN UPPER([Column]) LIKE '%AAA%' 
   OR UPPER([Column]) LIKE '%BBB%'
   OR UPPER([Column]) LIKE '%CCC%' 
   OR UPPER([Column]) LIKE '%DDD%' 
   OR UPPER([Column]) LIKE '%EEE%'  
 THEN 'Category1'
 WHEN UPPER([Column]) LIKE '%FFF%' 
   OR UPPER([Column]) LIKE '%GGG%' 
   OR UPPER([Column]) LIKE '%HHH%' 
 THEN 'Category2'
 WHEN UPPER([Column]) LIKE '%III%' 
   OR UPPER([Column]) LIKE '%JJJ%'  
 THEN 'Category3'
 WHEN UPPER([Column]) LIKE '%KKK%'
   OR UPPER([Column]) LIKE '%LLL%'
   OR UPPER([Column]) LIKE '%MMM%'
 THEN 'Category4' END TYPE
FROM [Table]

Это работает нормально, но проблема в том, что они хотят добавить больше шаблонов в будущем, и у них нет доступа к исходному коду. Поэтому они хотят иметь возможность загружать свои шаблоны через плоский файл, который будет извлечен и сохранен в таблице, подобной этой:

+-------+-----------+---------+
| Level | Category  | Pattern |
+-------+-----------+---------+
|     1 | Category1 | AAA     |
|     1 | Category1 | BBB     |
|     1 | Category1 | CCC     |
|     1 | Category1 | DDD     |
|     1 | Category1 | EEE     |
+-------+-----------+---------+
|     2 | Category2 | FFF     |
|     2 | Category2 | GGG     |
|     2 | Category2 | HHH     |
+-------+-----------+---------+
|     3 | Category3 | III     |
|     3 | Category3 | JJJ     |
+-------+-----------+---------+
|     4 | Category4 | KKK     |
|     4 | Category4 | LLL     |
|     4 | Category4 | MMM     |
+-------+-----------+---------+

Итак, теперь я пытаюсь выяснить, существует ли какой-либо автоматизированный способ конструирования оператора CASE WHEN сверху (с использованием T-SQL или сценариев) с использованием таблицы Pattern в качестве входных данных. Порядок CASE WHEN также очень важен, и поэтому я добавил столбец «Уровень».

SSIS будет использоваться для назначения категории каждой строке в таблице. Существуют ли какие-либо компоненты в SSIS, чтобы помочь мне в достижении моей цели?

1 Ответ

0 голосов
/ 04 июля 2018

Здесь у вас есть 2 различных решения, которые вы можете использовать с TSQL.

1) Зацикливание обновлений (быстрее). Я предполагаю, что Category на [Table] является нулевым перед обновлением.

DECLARE @MaxLevel INT = (SELECT ISNULL(MAX(Level), 0) FROM Category)

DECLARE @LevelIterator INT = 1

WHILE @LevelIterator <= @MaxLevel
BEGIN

    UPDATE T SET
        Category = C.Category
    FROM
        [Table] AS T
        INNER JOIN Category AS C ON UPPER(T.[Column]) LIKE '%' + C.Pattern + '%'
    WHERE
        C.Level = @LevelIterator AND
        T.Category IS NULL

    SET @LevelIterator += 1

END

2) Массовое обновление (медленнее)

;WITH MinimumLevelMatch AS
(
    SELECT
        T.[Column],
        MinLevel = MIN(C.Level)
    FROM
        [Table] AS T
        INNER JOIN Category AS C ON UPPER(T.[Column]) LIKE '%' + C.Pattern + '%'
    GROUP BY
        T.[Column]
),
CategoryByLevel AS
(
    SELECT DISTINCT
        C.Level,
        C.Category
    FROM
        Category AS C
)
UPDATE T SET
    Category = C.Category
FROM
    [Table] AS T
    INNER JOIN MinimumLevelMatch AS M ON T.[Column] = M.[Column]
    INNER JOIN CategoryByLevel AS C ON M.MinLevel = C.Level

Старайтесь избегать использования служб SSIS для реализации бизнес-логики. Используйте его для своей основной цели, интегрирующих систем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...