SQL Server:选择多次使用

时间:2019-05-10 15:14:04

标签: sql sql-server variables select

我需要一个查询,根据给定的描述对表中的每个记录进行分类。例如,如果描述包含“ 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

这只是我在考虑的事情,如果您知道另一种方法也将有所帮助。

感谢您的帮助。

2 个答案:

答案 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

如果简单的权重值不起作用,那么您还必须设置第二个表,这些表也保留了加入的关键词。然后只保留不匹配的内容。