Я не уверен, что могу напрямую использовать '=' для сравнения 2 столбцов со строковыми значениями.
Предполагая, что вы храните числа в строке (VARCHAR
)поле и добавление одного к ним имеет смысл (даже если это оставляет нас под сомнением при проектировании решения об использовании строк):
Настройка :
CREATE TABLE t1 ( c1 VARCHAR(1), c2 VARCHAR(1), c3 VARCHAR(1) );
INSERT INTO t1 ( c1, c2, c3 ) VALUES( '1', '1', '1' );
INSERT INTO t1 ( c1, c2, c3 ) VALUES( '1', '2', '1' );
INSERT INTO t1 ( c1, c2, c3 ) VALUES( '1', NULL, '1' );
Запрос :
Ваше третье условие T1.C1<T1.C2
никогда не будет достигнуто, поскольку оно соответствует второму условию T1.C1 <> T1.C2
.Если вместо этого оно заменено условием ELSE
, то оно будет сопоставлено, если одно или другое значение равно NULL
, а оба значения T1.C1 = T1.C2
и T1.C1 <> T1.C2
будут ложными.(Кроме того, вам не нужны псевдонимы таблиц везде, поскольку вы используете только одну таблицу; поэтому в целях простоты и удобочитаемости они были удалены)
select C1,
C2,
C3,
case
when C1 = C2 then C1 + 1
when C1 <> C2 then C2 + 1
ELSE 0
end as C4
from T1;
Oracle 18c Output:
C1 | C2 | C3 | C4
:- | :--- | :- | -:
1 | 1 | 1 | 2
1 | 2 | 1 | 3
1 | <em>null</em> | 1 | 0
db <> fiddle здесь
Выход SQL Server 2017 :
(SQL Server 2012 был недоступен для БД <> Fiddle, когда я писал это)
C1 | C2 | C3 | C4
:- | :--- | :- | -:
1 | 1 | 1 | 2
1 | 2 | 1 | 3
1 | <em>null</em> | 1 | 0
db <> fiddle здесь
Выходы идентичны, и соответствующие условия случая достигнуты, и вы можете использовать =
и <>
для сравнения строковых столбцов.