Я пытаюсь найти лучший способ проверить, содержит ли переменная CHAR/VARCHAR2
символы (NULL
или пробелы следует считать одинаковыми, как "без значения"):
Я знаю, что естьнесколько решений, но кажется, что (NVL(LENGTH(TRIM(v)),0) > 0)
быстрее, чем (v IS NOT NULL AND v != ' ')
Есть идеи, почему? Или я что-то не так сделал в своем тестовом коде?
Протестировано с Oracle 18c
в Linux, UTF-8 db charset
...
Я получаю следующие результаты:
time: +000000000 00: 00: 03.582731000
время: +000000000 00: 00: 02.494980000
set serveroutput on;
create or replace procedure test1
is
ts timestamp(3);
x integer;
y integer;
v char(500);
--v varchar2(500);
begin
ts := systimestamp;
--v := null;
v := 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
for x in 1..50000000
loop
if v is not null and v != ' ' then
y := x;
end if;
end loop;
dbms_output.put_line('time:' || (systimestamp - ts) ) ;
end;
/
create or replace procedure test2
is
ts timestamp(3);
x integer;
y integer;
v char(500);
--v varchar2(500);
begin
ts := systimestamp;
--v := null;
v := 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
for x in 1..50000000
loop
if nvl(length(trim(v)),0) > 0 then
y := x;
end if;
end loop;
dbms_output.put_line('time:' || (systimestamp - ts) ) ;
end;
/
begin
test1();
test2();
end;
/
drop procedure test1;
drop procedure test2;
quit;