Значение IF находится в списке установленного значения в следующем столбце NULL - PullRequest
0 голосов
/ 16 апреля 2019

У меня огромная таблица SQL, и мне нужно отфильтровать несколько столбцов (называемых Field), если они находятся в этом списке:

AAA, BBB, CCC, DDD, EEE

Если это так, установите соответствующий столбец value вNULL.

Позвольте привести пример таблицы:

Field1  Value1  Field2  Value2 ...... Field10  Value10
  AAA     9A      AAA     9A            CCC       World    
  BBB     1       KKK     0    
  ZZZ     9       AAA     9A            CCC       42      
  CCC     7
  LLL     9       AAA     3             III       98     
  KKK     3       AAA     4    
  DDD     100     AAA     Hello         CCC       6  

Не все комбинации значений полей заполняются до Value10.Однако каждый столбец с именем FieldXX должен быть проверен на наличие записей в списке.Если ячейка равна записи в списке, соответствующему полю значения должно быть присвоено значение NULL.В противном случае поле значения останется нетронутым.

Я изо всех сил пытаюсь найти правильное выражение CASE для этой конкретной проблемы.Я попробовал следующий код:

SELECT CAST(
             CASE 
                  WHEN Field* = AAA or BBB or CCC or DDD or EEE 
                     THEN Value* = 0
                  ELSE Value* = Value*
             END AS bit)
FROM dbo.Log

Но этот запрос полностью не выполняется, и он может не выполняться для определенных пар значение-поле.

Ожидаемый результат

Field1  Value1  Field2  Value2 ...... Field10  Value10
  AAA     0       AAA     0            CCC       0    
  BBB     0       KKK     0    
  ZZZ     9       AAA     0            CCC       0      
  CCC     0
  LLL     9       AAA     0            III       98     
  KKK     3       AAA     0    
  DDD     0       AAA     0            CCC       0 

Имя таблицы dbo.Log.

Ответы [ 4 ]

2 голосов
/ 16 апреля 2019

Если я правильно понял, вы пытаетесь обновить столбцы ValueX на основе данных FieldX. В этом случае вам нужно записать условие Case для каждого столбца.

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

UPDATE A_LOG 
SET VALUE1 = CASE WHEN FIELD1 IN ('AAA','BBB','CCC','DDD','EEE' ) THEN 0 ELSE VALUE1 END,
VALUE2 = CASE WHEN FIELD2 IN ('AAA','BBB','CCC','DDD','EEE' ) THEN 0 ELSE VALUE2 END,
VALUE3 = CASE WHEN FIELD3 IN ('AAA','BBB','CCC','DDD','EEE' ) THEN 0 ELSE VALUE3 END
.
.
VALUE10 = CASE WHEN FIELD10 IN ('AAA','BBB','CCC','DDD','EEE' ) THEN 0 ELSE VALUE10 END

Или вы можете сгенерировать оператор Update с помощью динамического запроса, как показано ниже

DECLARE @IN VARCHAR(100)=' IN (''AAA'',''BBB'',''CCC'',''DDD'',''EEE'' )'
, @SQL VARCHAR(MAX) =  'UPDATE A_LOG SET '

SELECT @SQL = @SQL+  VAL FROM 
(
SELECT    COLUMN_NAME + ' = CASE WHEN FIELD'+ REPLACE(COLUMN_NAME,'VALUE','')
+ @IN+ ' THEN 0 ELSE '+ COLUMN_NAME + ' END,
' VAL
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'LOG'
AND COLUMN_NAME LIKE 'VALUE%'
)A

SELECT @SQL = SUBSTRING(@SQL,1,LEN(@SQL)-3)
SELECT @SQL

Это даст вам оператор обновления для каждого столбца с условием регистра.

1 голос
/ 16 апреля 2019

Я почти уверен, что подстановочный знак, который вы пытаетесь использовать для CASE WHEN, недопустим.

Вы можете использовать переменные для создания строки SQL, которую затем сможете копировать и выполнять - таким образом, если вам нужно увеличить количество проверяемых полей, вам нужно изменить только одну часть кода:)

Приведенный ниже код создает строку SQL, а затем печатает ее в окне консоли:

DECLARE @cnt INT = 1;
DECLARE @sql VARCHAR(MAX) = 'SELECT ';
WHILE @cnt <= 10
BEGIN 
DECLARE @COLUMN VARCHAR(MAX) = 'Field' + CAST(@cnt AS varchar(max))
DECLARE @VALUE VARCHAR(MAX) = 'Value' + CAST(@cnt AS varchar(max))
SET @sql = @sql + @COLUMN + ', CASE WHEN ' + @COLUMN + '= ''AAA'' OR '  + @COLUMN + '= ''BBB'' OR ' + @COLUMN + '= ''CCC'' OR ' + @COLUMN + '= ''DDD'' OR ' + @COLUMN + '= ''EEE'' THEN 0 ELSE ' + @VALUE + ' END AS ' + @VALUE;
IF @cnt != 10 
(SELECT @sql = @sql + ',')
SET @cnt = @cnt +1
END

SET @sql = @sql + ' INTO [dbo].[LogFilter] FROM [dbo].[Log]';
PRINT @sql;

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

SELECT 
  Field1, 
  CASE WHEN Field1= 'AAA' OR Field1= 'BBB' OR Field1= 'CCC' OR Field1= 'DDD' OR Field1= 'EEE'
  THEN 0 ELSE Value1 END AS Value1,
  Field2, 
  CASE WHEN Field2= 'AAA' OR Field2= 'BBB' OR Field2= 'CCC' OR Field2= 'DDD' OR Field2= 'EEE' 
  THEN 0 ELSE Value2 END AS Value2,
  Field3, 
  CASE WHEN Field3= 'AAA' OR Field3= 'BBB' OR Field3= 'CCC' OR Field3= 'DDD' OR Field3= 'EEE' 
  THEN 0 ELSE Value3 END AS Value3, 
  ...
  INTO [dbo].[LogFilter] FROM [dbo].[Log]

Это утверждение SELECT INTO выше помещает отфильтрованную информацию в новую таблицу:)

1 голос
/ 16 апреля 2019

Оператор Case не будет работать так, как вы написали.Вам необходимо индивидуально сравнить значения в каждом поле и установить значение в столбце «Значение».

SELECT CAST(
             CASE 
                  WHEN Field1 = AAA or BBB or CCC or DDD or EEE 
                     THEN Value1 = 0                     
                  ELSE Value1
             END AS bit) Value1,
        CAST(
             CASE 
                  WHEN Field2 = AAA or BBB or CCC or DDD or EEE 
                     THEN Value2 = 0                     
                  ELSE Value2
             END AS bit) Value2,
        .    
        .
        .
        .
        <need to write separate case statement for each column which is to be compared>
FROM dbo.Log
1 голос
/ 16 апреля 2019

Попробуйте это:

    Declare @Table Table(Field1 varchar(10), Value1 varchar(10),  Field2 varchar(10),  Value2 varchar(10) ,Field10 varchar(10) , Value10 varchar(10))
    Declare @NewTable Table(Field1 varchar(10), Value1 varchar(10),  Field2 varchar(10),  Value2 varchar(10) ,Field10 varchar(10) , Value10 varchar(10))

    insert into @Table
    SELECT 'AAA','9A','AAA','9A','CCC','World' Union All
    SELECT 'BBB','1','KKK','0',NULL,NULL    Union All
    SELECT 'ZZZ','9','AAA','9A','CCC','42'   Union All    
    SELECT 'CCC','7',NULL,NULL,NULL,NULL Union All
    SELECT 'LLL','9','AAA','3','III','98' Union All
    SELECT 'KKK','3','AAA','4',NULL,NULL    Union All
    SELECT 'DDD','100','AAA','Hello','CCC','6' 


    INSERT into @NewTable
    Select Field1,CASE WHEN Field1 in ('AAA','BBB','CCC','DDD','EEE') THEN 0 else Value1 end As Value1
        ,Field2,CASE WHEN Field2 in ('AAA','BBB','CCC','DDD','EEE') THEN 0 else Value2 end As Value2
        ,Field10,CASE WHEN Field10 in ('AAA','BBB','CCC','DDD','EEE') THEN 0 else Value10 end As Value10
    from @Table 

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