SQL Server: выберите используемый несколько раз - PullRequest
0 голосов
/ 10 мая 2019

Мне нужен запрос для классификации каждой записи из таблицы на основе заданного описания. Например, если описание содержит «CABL», классификация будет «Cable», если она содержит «SLEV», то будет «Slev», если она содержит «TERM», тогда будет «Terminal», если она содержит «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 JOIN для выбора всех классификаций, а затем их разделения, проблема в том, что мне нужно каждый раз составлять предложение SELECT Мне это понадобится, поэтому мне было интересно, есть ли форма для того, чтобы поместить SELECT «внутри» переменной и выполнять только объединения, используя их.

SELECT * FROM Table WHERE Descrip LIKE 'CABL%' AS cable_selection
SELECT * FROM Table WHERE Descrip LIKE '%MULTI%' AS multi_selection

Это просто то, о чем я думаю, если вы знаете другой способ сделать это, это тоже поможет.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Похоже, у вас есть система приоритетов для типов, поэтому используйте тот факт, что case выражения вычисляются в следующем порядке:

(CASE WHEN Descrip LIKE '%MULTI%' THEN 'MULTI'
      WHEN Descrip LIKE 'CABL%' THEN 'CABLE'
      WHEN Descrip LIKE '%SLEV%' THEN 'SLEV'
      ELSE '???!!!'
 END)
0 голосов
/ 10 мая 2019

Я бы использовал таблицу вместо стандартных операторов выбора.

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

Если простое значение веса не сработает, вам придется настроить вторую таблицу исключенных ключевых слов, к которым вы также присоединились. Тогда оставляйте только те, которые не совпадают.

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