Значимое выражение
Функция
Определение значения.
Спецификация
::=::=::=::=::=::=::=::=::=::=::=::=Синтаксические правила
-
Первым символом лексемы, следующей за унарным знаком операции, не может быть знак плюс или минус.
-
Если тип
<значения>– символьная/байтовая строка, то<значимое выражение>может включать только операцию конкатенации. Тип результата – также символьная/байтовая строка.Конструкция
select 'Фирма: ' || make || ' модель: ' || model from auto; |Фирма: FORD модель: MERCURY COMET GT V8| …
эквивалентна:
select 'Фирма: ' + make + ' модель: ' + model from auto;
-
Использование в
<значимом выражении>типа данныхBLOBне допускается. -
При использовании в
<значимом выражении>типа данныхDATEдопускаются операции добавления (вычитания) интервалов даты.select sysdate + to_date('01','mm'); select sysdate, (sysdate+to_date('01','mm')) - to_date('05','yy'); |24.04.2003:14:26:51.00 |24.05.1998:14:26:51.00 | -
Если у обоих операндов точный числовой тип, то и результат будет иметь точный числовой тип, определяемый следующим образом:
-
если один из операндов имеет тип
DECIMAL, то тип результата –DECIMAL; -
если оба операнда целые, то результат будет иметь целый тип;
-
если один из операндов имеет тип
INT, то тип результата –INT; -
если один из операндов имеет тип
BIGINT, то тип результата –BIGINT; -
если оба операнда типа
SMALLINT, тип результата –SMALLINT.
-
-
Если
<значимое выражение>является<числовым выражением>, то в операциях сравнения и присвоения допускается использовать строковый литерал без оператора преобразования.create or replace table tst (si smallint,i int, bi bigint, d double, nm numeric); ! Эти запросы эквивалентны: insert into tst (si,i,bi,d,nm) values (12, 3658, 5688854, 45.e+3, 56.099); insert into tst (si,i,bi,d,nm) values ('12', '3658', '5688854', '45.e+3', '56.099'); ! Эти запросы эквивалентны: select count(*) from auto where year='70'; select count(*) from auto where year=70; select count(*) from auto where year= cast '70' as int; -
В случае арифметических действий над аргументами типа
DECIMALтипом результата беретсяDECIMAL(30,10). -
Если тип одного из операндов приближенный, то тип результата тоже будет приближенным. Типом данных результата будет
DOUBLE, если хотя бы один из операндов имеет типDOUBLE. -
Если
<значение>равноNULL, то результатом<значимого выражения>тоже будетNULL.create table tab1 (i1 int, i2 smallint, r real); insert into tab1 values (1, 5, 56.8); insert into tab1 values (1, NULL, 56.8); select * from tab1; |1|5 |56.7999992| |1|NULL|56.7999992|
select (i1+i2)/r from tab1; |0.1056338 | |NULL |
-
Если операция не указана, то результат
<значимого выражения>берется из<значения>. -
Когда
<значимое выражение>применяется к строке таблицы, то указание столбца этой таблицы есть его значение в этой строке. -
Двухместные арифметические знаки «+», «-», «*», «/» обозначают сложение, вычитание, умножение, деление соответственно. Если делитель равен 0, будет зафиксирована исключительная ситуация.
-
Унарный плюс не меняет операнд. Унарный минус меняет знак ненулевого числа на противоположный.
-
Если тип результата – точный числовой, то возможны следующие варианты:
-
если операция – не деление, и результат ее точно не представляется значением результирующего типа, то будет зафиксирована исключительная ситуация;
-
если операция – деление, и результат ее представляется значением результирующего типа с потерей одной или более значащих цифр, то будет зафиксирована исключительная ситуация.
-
-
Выражения внутри круглых скобок вычисляются первыми, и, если порядок вычисления не задан круглыми скобками, унарные операции выполняются перед умножением/делением, умножение/деление – перед сложением/вычитанием, операции одного уровня выполняются слева направо.
create table tab1 (i1 int, i2 int, i3 int, i4 int); insert into tab1 values (1,2,3,4); select * from tab1; |1 |2 |3 |4 |
select (i1 * i2) + (i3 * i4) from tab1; |14|
select i1 * i2 + i3 * i4 from tab1; |14|
select i1 * (i2 + i3) * i4 from tab1; |20|
select ((length(make)+ year) * (length(model) -sqrt(4)))/100 from auto;
-
Глубина стека для обработки выражений 50.
-
При обработке числовой константы, если не удалось ее преобразовать к типу
DECIMAL, делается попытка преобразовать ее к типуDOUBLE.
Общие правила
-
Если используются арифметические операторы, то результат
<значимого выражения>получается путем применения операторов к значениям операндов. -
Если какой-либо из операндов равен NULL, результат NULL.
-
Арифметические операторы применимы только к числовым операндам.
-
При невозможности вычислить
<значимое выражение>(например, деление на нуль или переполнение числа) фиксируется исключительная ситуация. -
Если арифметическая ошибка выявляется при выполнении агрегатной функции, то фиксируется исключительная ситуация.
-
Если эти алгоритмы обработки являются неприемлемыми при обработке данных, необходимо принять дополнительные меры, такие как:
-
включить проверку на нуль в операциях деления и установить желаемое (по смыслу) значение результата в таких случаях;
create table tab1 (i1 dec, i2 dec not null); insert into tab1 values (1,2); insert into tab1 values (1,0); select * from tab1; |1.0 |2.0 | |1.0 |0.0 |
select case i2 when 0 then 'Деление на нуль' else cast i1/i2 as char end from tab1; |0.5|Деление на нуль
или
select case i2 when 0 then null else i1/i2 end from tab1; -
добавить дополнительные предикаты для управления NULL-значениями (подобно
CHECKили атрибутNOT NULLпри определении свойств столбца таблицы), например:check (c1*c2 is not NULL and c1*c2>5000);
-
Примеры
Значимое выражение – <спецификация значения>:
select sysdate; select * from person where name=user; select rownum, count(*) from person group by name;
Значимое выражение – <имя столбца>:
select distinct make from auto;
Значимое выражение – <агрегатная функция>:
select default( make) from auto; select count(*) from person where name='ADKINSON';
Значимое выражение – <значение последовательности>:
select ("my_seq".nextval +1000)/34;
select * from auto
where personid = (select "my_seq".currval);
Значимое выражение – (<значимое выражение>):
select (default( make)) from auto; select (sysdate);
Значимое выражение – <подзапрос>:
select model from auto
where auto.personid=
(select personid from person
where auto.personid=person.personid and name='ANDERSON');
|OLDSMOBILE 98|
|PLUS 8 |
…
Значимое выражение – <спецификация типа>:
select count(*) from auto where cast make as char(1) in ( 'A', 'B', 'C') group by cast make as char(1); |98 | |10 | |175 |
Значимое выражение – <спецификация значения по условию>:
select case year when 70 then 'Год выпуска 1970'
else 'Год выпуска 1971'
end,
count(*)
from auto group by year;
|Год выпуска 1970 |465 |
|Год выпуска 1971 |535 |
Значимое выражение – <числовое выражение>:
select make, mod(length(make), 3), year+1900 from auto fetch first 2; |FORD |1 |1971 | |ALPINE |0 |1970 |
Значимое выражение – <строковое выражение>:
select
case year when 70 then 'Год выпуска 1970'
else 'Год выпуска 1971' end
|| ' : ' || to_char( count(*), '999')
from auto group by year;
|Год выпуска 1970 : 465 |
|Год выпуска 1971 : 535 |
Значимое выражение – <дата-время выражение>:
select sysdate + to_date('17', 'dd');
Значимое выражение – <логическое выражение>:
select count(*) from auto where (length(make)-10)>0 or (year-70)=0 group by length(make)-10 fetch first 3; |3 | |14 | |74 |