我需要一个查询,根据给定的描述对表中的每个记录进行分类。例如,如果描述包含“ CABL”,则分类将为“电缆”,如果包含“ SLEV”,则分类为“ Slev”,如果包含“ TERM”,则分类为“终端”,如果包含“ MULTI”然后将是“多导体”,以此类推,还有许多其他分类。
它是这样的:
DESCRIPTION: CABL 150C TXL 0.500 BLU LT XLPE THIN
CLASSIFICATION: Cable
DESCRIPTION: SLEV ID=0.24 OD=0.34 L=1.04 CLR
CLASSIFICATION: Slev
DESCRIPTION: TERM 6 F 6.3 DFK AG
CLASSIFICATION: Terminal
DESCRIPTION: CABL 0.500 BLK MULTICONDUCTOR
CLASSIFICATION: Multiconductor
如您所见,当描述中包含多个“关键词”时,问题就开始了。在第四个示例中,描述中有两个关键字(“ CABL”和“ MULTI”),但正确的分类是“ Multiconductor”。
我正在使用CASE进行查询,它看起来像这样:
CASE
WHEN Descrip LIKE 'CABL%'
AND Descrip NOT LIKE '%MULTI%'
AND Descrip NOT LIKE '%SLEV%'
THEN 'CABLE'
WHEN Descrip LIKE '%SEAL%'
AND Descrip NOT LIKE '%CONN%'
AND Descrip NOT LIKE '%LOCK%'
AND Descrip NOT LIKE '%TERM%'
THEN 'SEAL'
END AS Commodity
该查询将起作用,但将成为一个很大的查询,我当时正在考虑使用LEFT / RIGHT / INNER JOINs选择所有分类,然后将它们隔离,问题是我每次都需要输入SELECT语句我将需要它,所以我想知道是否有一种形式可以将SELECT“放入”变量,并且仅使用它们进行联接。
SELECT * FROM Table WHERE Descrip LIKE 'CABL%' AS cable_selection
SELECT * FROM Table WHERE Descrip LIKE '%MULTI%' AS multi_selection
这只是我在考虑的事情,如果您知道另一种方法也将有所帮助。
感谢您的帮助。
答案 0 :(得分:1)
您似乎拥有类型的优先级系统,因此请充分利用case
表达式按以下顺序求值的事实:
(CASE WHEN Descrip LIKE '%MULTI%' THEN 'MULTI'
WHEN Descrip LIKE 'CABL%' THEN 'CABLE'
WHEN Descrip LIKE '%SLEV%' THEN 'SLEV'
ELSE '???!!!'
END)
答案 1 :(得分:0)
我将使用表而不是罐装的select语句。
use tempdb;
create table DescriptionTable (
[desc] varchar( 50 ),
class varchar( 20 )
)
go
insert into DescriptionTable ( [desc] ) values
('CABL 150C TXL 0.500 BLU LT XLPE THIN'),
('SLEV ID=0.24 OD=0.34 L=1.04 CLR'),
('TERM 6 F 6.3 DFK AG'),
('CABL 0.500 BLK MULTICONDUCTOR' )
create table #classMap (
keyWord varchar( 20 ),
classification varchar( 20 ),
weight int
)
insert into #classMap ( keyWord, classification, weight ) values
( 'CABL%', 'CABLE', 1 ),
( '%SLEV%', 'SLEV', 2 ),
( '%TERM%', 'TERMINAL', 3 ),
( '%MULTICONDUCTOR', 'Multiconductor', 4 )
;;with BestWeight as (
select top 1 with ties [desc], classification
from DescriptionTable
join #classMap
on [desc] like keyWord
order by ROW_NUMBER() over ( partition by [desc] order by weight desc )
)
select * from BestWeight;
drop table #classMap;
结果是:
desc classification weight
CABL 0.500 BLK MULTICONDUCTOR Multiconductor 4
CABL 150C TXL 0.500 BLU LT XLPE THIN CABLE 1
SLEV ID=0.24 OD=0.34 L=1.04 CLR SLEV 2
TERM 6 F 6.3 DFK AG TERMINAL 3
如果简单的权重值不起作用,那么您还必须设置第二个表,这些表也保留了加入的关键词。然后只保留不匹配的内容。