Как использовать математическое выражение в результате выражения регистра в Oracle и SQL Server - PullRequest
0 голосов
/ 10 апреля 2019

Я хотел использовать математическое выражение в результате оператора case. Например,

select T1.C1, T1.C2, T1.C3,
case 
when T1.C1 = T1.C2 <or any condition for that sake>
then (T1.C3 + 1) --> I want to achieve this
when T1.C1 <> T1.C2
then (T1.C3 + 2)
when T1.C1<T1.C2
then 0 --> just display 0
end as C4 from Table T1;

Я пробовал аналогичный запрос, как упомянуто в примере в Oracle SQL. Я не получил никаких ошибок во время выполнения, но результат не отображается. Получен только результат отображения 0, остальные результаты не отображаются

1 Ответ

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

Я не уверен, что могу напрямую использовать '=' для сравнения 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 здесь

Выходы идентичны, и соответствующие условия случая достигнуты, и вы можете использовать = и <> для сравнения строковых столбцов.

...