2017-02-20 3 views
0

Я написал функцию, которая возвращает одно значение на основе нескольких условий для нескольких таблиц. Функция работает, но я ищу более простой способ получить значение. Ниже приведена логика, которую я использовал для создания функции в анализаторе запросов для тестирования нескольких результатов. Я думал об использовании нескольких аргументов case/when в предложении where, но не мог заставить его работать - любая помощь была бы весьма признательна.скалярная функция sql с несколькими соединениями и условиями

declare 
    @cat varchar(10) = 'A1' 
    ,@stat varchar(10) = '20' 
    ,@level int = 4 
    ,@sop varchar(10) = '' 
    ,@payid varchar(10) = '' 
    ,@paysubid varchar(10) = '' 

    declare @out varchar(10) = '' 

-- status match - sop, payid and subid override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = @sop and isnull(a.[payid],'') = @payid and isnull(a.[paysubid],'') = @paysubid) 
     and isnull(b.[status],'') = @cat 
     and isnull(c.[status],'') = @stat 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'status match - sop, payid and subid override. out value = '[email protected] 
      return 
     end 

    -- status match - sop only override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (a.sourceofpay = @sop and isnull(a.[payid],'') = '' and isnull(a.[paysubid],'') = '') 
     and isnull(b.[status],'') = @cat 
     and isnull(c.[status],'') = @stat 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'status match - sop override only. out value = '[email protected] 
      return 
     end 

    -- status match - payid and subid only override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = '' and isnull(a.[payid],'') = @payid and isnull(a.[paysubid],'') = @paysubid) 
     and isnull(b.[status],'') = @cat 
     and isnull(c.[status],'') = @stat 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'status match - payid and subid override only. out value = '[email protected] 
      return 
     end 

    -- status match - no overide (default) 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = '' and isnull(a.[payid],'') = '' and isnull(a.[paysubid],'') = '') 
     and isnull(b.[status],'') = @cat 
     and isnull(c.[status],'') = @stat 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'status match - no overide (default). out value = '[email protected] 
      return 
     end 

    -- no status match - sop, payid and subid override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = @sop and isnull(a.[payid],'') = @payid and isnull(a.[paysubid],'') = @paysubid) 
     and isnull(b.[status],'') = @cat 
     and a.stat277_statusId is null 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'no status match - sop, payid and subid override. out value = '[email protected] 
      return 
     end 

    -- no status match - sop only override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (a.sourceofpay = @sop and isnull(a.[payid],'') = '' and isnull(a.[paysubid],'') = '') 
     and isnull(b.[status],'') = @cat 
     and a.stat277_statusId is null 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'no status match - sop override only. out value = '[email protected] 
      return 
     end 

    -- no status match - payid and subid only override 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = '' and isnull(a.[payid],'') = @payid and isnull(a.[paysubid],'') = @paysubid) 
     and isnull(b.[status],'') = @cat 
     and a.stat277_statusId is null 
     and a.[csflevel] = @level 

    if @out <> '' 
     begin 
      print 'no status match - payid and subid only override. out value = '[email protected] 
      return 
     end 

    -- no status match - no overide (default) 
    select @out = d.[billedstat] 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 
    where (isnull(a.sourceofpay,'') = '' and isnull(a.[payid],'') = '' and isnull(a.[paysubid],'') = '') 
     and isnull(b.[status],'') = @cat 
     and a.stat277_statusId is null 
     and a.[csflevel] = @level 

    print 'default ''''' 
+0

Вы уверены, что используете MySQL? Это больше похоже на код MS SQL Server. – jarlh

ответ

0

Вы можете использовать оператор case в списке, чтобы охватить все ваши условия, а не в предложении where, например.

select @message = 
    case 
    when isnull(a.sourceofpay,'') = @sop 
     and isnull(a.[payid],'') = @payid 
     and isnull(a.[paysubid],'') = @paysubid 
     and isnull(b.[status],'') = @cat 
     and isnull(c.[status],'') = @stat 
     and a.[csflevel] = @level then 
     'status match - sop, payid and subid override. out value = ' 
    when ... 
    else 'default ''''' end, 
    @out = d.billedstat 
    from [dbo].[BilledStatusOverride] a 
    inner join [dbo].[cat277] b on a.[cat277_statusId] = b.[COUNTER] 
    left outer join [dbo].[stat277] c on a.[stat277_statusId] = c.[COUNTER] 
    inner join [dbo].[bsname] d on a.[bsname_statId] = d.[counter] 

Очевидно, замените ... другими условиями проведения испытаний. Это все еще не особенно приятно, но, по крайней мере, это всего лишь один оператор SQL.