我的客户希望通过识别列字段名称中的特定字符串模式('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或脚本)。 CASE WHEN的顺序也很重要,这就是为什么我添加了“级别”列。
SSIS将用于将类别分配给表中的每一行。 SSIS中是否有任何组件可以帮助我实现目标?
答案 0 :(得分:1)
这里有两种可以与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来实现业务逻辑。将其用于主要目的集成系统。