Динамический SQL, как закодировать ‘ ‘ в динамический SQL?

#sql #oracle

#sql #Oracle

Вопрос:

Доброе утро

 select CASE t.gift_club_start_date
       WHEN ' '  THEN ' '
       ELSE SUBSTR(t.gift_club_start_date,5,2)|| '/' ||SUBSTR(t.gift_club_start_date,7,2)|| '/' ||SUBSTR(t.gift_club_start_date,1,4) 
       END
from GIFT t
  

Это показывает, что если строки пусты, они отображаются пустыми.

Я пытаюсь выполнить этот код с помощью динамического SQL

 'select CASE t.gift_club_start_date
       WHEN '' ''  THEN '' ''
       ELSE SUBSTR(t.gift_club_start_date,5,2)|| ''/'' ||SUBSTR(t.gift_club_start_date,7,2)|| ''/'' ||SUBSTR(t.gift_club_start_date,1,4) 
       END
from GIFT t'
  

НО вывод показывает это // , когда строка пуста.

Итак, как я могу правильно закодировать, чтобы показать пустую строку? Эта строка WHEN '' '' THEN '' ''

Большое спасибо, mcuh

Ответ №1:

В принципе, вы можете использовать double ' для решения:

 SQL> declare
  2      vSQL varchar2(100);
  3      vVar varchar2(100);
  4  begin
  5      vSQL := 'select '' '' from dual';
  6      execute immediate vSQL into vVar;
  7      dbms_output.put_line('result:<' || vVar || '>');
  8  end;
  9  /
result:< >
  

Другой способ может быть следующим:

 SQL> declare
  2      vSQL varchar2(100);
  3      vVar varchar2(100);
  4  begin
  5      vSQL := q'[select ' ' from dual]';
  6      execute immediate vSQL into vVar;
  7      dbms_output.put_line('result:<' || vVar || '>');
  8  end;
  9  /
result:< >
  

Для вашей ситуации обратите внимание, что «пустой» отличается от ' ' ; если вам нужно проверить наличие нулевых значений, вы должны использовать что-то вроде

 WHEN t.gift_club_start_date is NULL THEN...
  

Ответ №2:

Вы можете использовать ||CHR(39)

 'WHEN ' || CHR(39) || CHR(39) || ' THEN ' || CHR(39) || ' ' ||CHR(39)