SQL Измените значение параметра списка строк / varchar на список целых чисел - PullRequest
0 голосов
/ 20 декабря 2018

Как изменить значение моих параметров, сделанное из оператора case:

Set @CostType=Case When @ShowLabor ='Y'and @ShowEquipment ='Y' then ('1,3,5,7,8')
                when @ShowLabor ='Y'and @ShowEquipment ='N' then ('3,5')
                when @ShowLabor ='N'and @ShowEquipment ='Y' then ('1,7,8')
                else ('1,3,5,7,8') end

, в список целых чисел [EX: (1,3,5,7,8)], чтобычасть этого IN оператора:

Where JCCD.CostType in (@CostType) 

Я также попытался сделать это в виде столбца во временной таблице, как показано ниже, дайте мне знать, если это легче преобразовать из:

Declare @TempTable table (CostType int)
Set NOCOUNT ON;
Insert into @TempTable values 
(Case When @ShowLabor ='Y'and @ShowEquipment ='Y' then ('1,3,5,7,8')
      when @ShowLabor ='Y'and @ShowEquipment ='N' then ('3,5')
      when @ShowLabor ='N'and @ShowEquipment ='Y' then ('1,7,8')
      else   ('1,3,5,7,8') end )

1 Ответ

0 голосов
/ 20 декабря 2018

Я бы порекомендовал нормализовать ваш TempTable, примерно так:

ShowLabor | ShowEquipment | CostType
1         | 1             | 1
1         | 1             | 3
1         | 1             | 5
1         | 1             | 7
1         | 1             | 8
1         | 0             | 3
1         | 0             | 5
0         | 1             | 1
0         | 1             | 7
0         | 1             | 8

С помощью этого рефакторинга вы можете написать правильный запрос по строкам:

SELECT *
FROM JCCD
WHERE CostType IN (SELECT CostType FROM TempTable
                   WHERE ShowLabor = 1 AND ShowEquipment = 1);

ВОбщее хранение данных CSV в одном столбце / строке в базе данных не является хорошей практикой.Было бы намного лучше разместить каждое значение типа затрат в отдельной строке, как показано выше.

...