Использование SQL в CASE в предложении where - PullRequest
0 голосов
/ 04 сентября 2018

Вот пример таблицы:

     acIdent   |  acSubject          | acCode
     200.2.013 |                     | F-202
     200.2.013 | Minsk traktor works | F202.GRS

Вот что я пытался сделать:

     declare @subj varchar(30)

     set @subj = 'Minsk traktor works'

     select acIdent, acSubject, acCode
     from tHE_SetItemExtItemSubj where acIdent = '200.2.013' and
     acSubject = (
            case 
            when @subj = acSubject then @subj
            else '' end
         )

Моя цель - получить только одну запись. Мой пример возвращает обе записи. Если в таблице существует @subj, вернуть acCode - F202.GRS, иначе вернуть F-202.

Помогите пожалуйста

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Можно сделать что-то подобное с помощью case-функций:

 -- assumes @subj is not '' nor null. 
 select y.acIdent, y.acSubject, y.acCode
 from tHE_SetItemExtItemSubj y
 where y.acIdent = '200.2.013' 
   and y.acSubject = 
   (case 
    when exists(select * from  tHE_SetItemExtItemSubj x where 
                x.acIdent = y.acIdent and x.acSubject = @subj) 
    then @subj else '' 
    end)

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

 -- assumes @subj is not '' nor null. 
 select y.acIdent, y.acSubject, y.acCode
 from tHE_SetItemExtItemSubj y
 where y.acIdent = '200.2.013' 
   and 1 = 
   (case 
    when exists(select * from  tHE_SetItemExtItemSubj x where 
                x.acIdent = y.acIdent and x.acSubject = @subj) 
    then 
        case when y.acSubject = @subj then 1 else 0 end
    else 
        case when y.acSubject = '' then 1 else 0 end
    end)
0 голосов
/ 04 сентября 2018

Я скомпилировал ваш запрос выше, как показано ниже:

declare @MyTable as table
    (   ID  int identity primary key
    ,   acIdent     varchar(100)
    ,   acSubject   varchar(200)
    ,   acCode      varchar(100)
    )

insert into @MyTable
    (   acIdent
    ,   acSubject
    ,   acCode  )
    values
    (   '200.2.013'
    ,   ''
    ,   'F-202' ),
    (   '200.2.013'
    ,   'Minsk traktor works'
    ,   'F-202' )

declare @subj varchar(30)

    set @subj = 'Minsk traktor works'

    select
        acIdent
    ,   acSubject
    ,   acCode
    ,   case acSubject when  @subj then @subj else '' end
    from @MyTable where acIdent = '200.2.013'
    and  acSubject = (case when acSubject = @subj then @subj else '' end)

    select
        acIdent
    ,   acSubject
    ,   acCode
    ,   case acSubject when  @subj then @subj else '' end
    from @MyTable where acIdent = '200.2.013'
    and  acSubject = @subj

Из 2 запросов вы заметите, что первый запрос всегда будет содержать 2 строки, поскольку ваш код содержит ошибки.

Второй запрос, который вы заметите, даст вам только одну запись.

Результаты будут выглядеть так:

Результаты

0 голосов
/ 04 сентября 2018

Разве это не поможет, поскольку вам нужно получить только одну запись, используя только одно условие. Зачем использовать случай, если вам нужно проверить только одно условие?

declare @subj varchar(30)
set @subj = 'Minsk traktor works'
select top(1) acIdent, acSubject, acCode
from tHE_SetItemExtItemSubj 
where acIdent = '200.2.013' 
and (acSubject = @subj)
0 голосов
/ 04 сентября 2018

Если я вас правильно понял, вы ищете что-то вроде этого:

 declare @subj varchar(30)

 set @subj = 'Minsk traktor works'

 select top(1) acIdent, acSubject, acCode
 from tHE_SetItemExtItemSubj 
 where acIdent = '200.2.013' 
   and (acSubject = @subj or acSubject = '')
 order by len(acSubject) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...