Заменить столбец значениями, не равными нескольким значениям - PullRequest
0 голосов
/ 01 мая 2019

Если значение в столбце не равно ни A, ни B, замените это значение на «NO».

dataset

ColA     ColB
   A        L
NULL        P
   B        M
   C        G

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

ColA     ColB
   A        L
  NO        P
   B        M
  NO        G

Я попробовал это, но не повезло:

SELECT *, 
CASE WHEN ColA NOT IN(A,B) REPLACE (ColA, ColA, 'NO') 
ELSE ColA 
END ColA 
FROM dataset; 

Возвращает столбец со всеми "НЕТ".

Ответы [ 5 ]

2 голосов
/ 01 мая 2019

Ваш код не должен компилироваться, поэтому я думаю, что это не настоящий код.(1) Отсутствует THEN после WHEN.(2) Значения A и B должны быть заключены в одинарные кавычки, в противном случае они будут распознаваться как имена столбцов.Так что это должно быть записано как:

SELECT *, 
  CASE 
    WHEN ColA NOT IN('A','B') THEN REPLACE(ColA, ColA, 'NO') 
    ELSE ColA 
  END NewColA 
FROM dataset;

Это даст желаемые результаты, если в ColA не будет значения NULL.В случае NULL, ColA NOT IN('A','B') оценивается как NULL, и замена не будет.Вы можете написать оператор, используя Снежинка IFF(), например, так:

SELECT *, IFF(ColA IN ('A', 'B'), ColA, 'NO') NewColA
FROM dataset;

В случае, если ColA IN ('A', 'B') оценивается как NULL, тогда FALSE возвращается часть IFF(), что составляет 'NO'

0 голосов
/ 01 мая 2019

Чтобы быть в безопасности, вам, скорее всего, также необходимо добавить проверку IS NULL.Я считаю, что стандарты SQL, определенные NOT IN(), не должны работать со значениями NULL.

Поскольку ColA NOT IN('A','B') - это то же самое, что запись ColA <> 'A' OR ColB <> 'B' и SELECT 'A' <> NULL никогда не должны быть истинными.

Запрос

SELECT 
  (
    CASE
      WHEN ColA NOT IN('A','B') OR ColA IS NULL
      THEN 'NO'
      ELSE ColA
    END
  ) AS ColA
  , ColB
FROM 
 dataset
0 голосов
/ 01 мая 2019
SELECT 
CASE WHEN ColA NOT LIKE 'A' OR 'B' THEN 'NO' ELSE ColA END AS 'ColA'
,ColB
FROM Dataset;
0 голосов
/ 01 мая 2019

Еще один способ сделать это ...

SELECT Col1, Col2, ColN,
       CASE
         WHEN ColA = 'A' OR ColA = 'B' THEN ColA
         ELSE NULL
       END AS ColA
FROM   dataset   
0 голосов
/ 01 мая 2019

replace() не требуется, просто используйте case выражение:

select d.*, (case when cola in ('a', 'b')
                  then cola else 'NO'
             end)
from dataset d;
...