почему вывод является нулевым при select translate ('@', '', '') из dual; и почему результат равен @ при выборе замены ('@', '', '') из двойного; - PullRequest
0 голосов
/ 27 мая 2019

В основном, translate изменяет символ на символ и заменяет строку на строку, и здесь я попытался удалить пробелы, используя translate для подсчета количества слов.

select translate('  @',' ','') from dual;

select replace('  @',' ','') from dual;

select ename , nvl(length(replace(TRANSLATE(upper(trim(ename)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'' ','                           @ '),' ',''))+1,1) NOOFWORDs
from emp;

Ответы [ 2 ]

1 голос
/ 27 мая 2019
select translate('  @',' ','') from dual;

Возвращает NULL, потому что в Oracle пустые строки, к сожалению, дают NULL с. Следовательно, это эквивалентно

SELECT translate('  @', ' ', NULL)
       FROM dual;

и translate() возвращает NULL, когда аргумент равен нулю. На самом деле это хорошо задокументировано в «ПЕРЕВОД» :

enter image description here

(...)

Нельзя использовать пустую строку для to_string, чтобы удалить все символы в from_string из возвращаемого значения. Oracle Database интерпретирует пустую строку как ноль, и если эта функция имеет нулевой аргумент, то она возвращает ноль.

Если вы хотите заменить один символ, используйте replace(), как вы уже сделали. Для нескольких, но более чем одного символа вы можете вкладывать replace() s.

Это, однако, становится неудобным, когда вы хотите заменить довольно много символов. В такой ситуации, если заменяющим символом является только один символ или пустая строка regexp_replace() с использованием класса символов или альтернатив, может оказаться полезным.

Например

SELECT regexp_replace('a12b478c01', '[0-9]', '')
       FROM dual;

заменяет все цифры, поэтому остается 'abc' и

SELECT regexp_replace('ABcc1233', 'c|3', '')
       FROM dual;

удаляет все '3' или 'c' и приводит к 'AB12'. В вашем самом примере

SELECT regexp_replace('  @', ' ', '')
       FROM dual;

также сработает и даст вам '@'. Хотя в простом случае вашего примера достаточно простого replace().

1 голос
/ 27 мая 2019

К сожалению, Oracle сделал много странных выборов в отношении пустой строки или пустой строки.

Один из них связан с переводом.TRANSLATE вернет NULL, если любой его аргументов (включая последний) равен NULL, независимо от того, каким должно быть логическое поведение.

Итак, для удаления пробелов(скажем) с помощью TRANSLATE вы должны добавить символ, который НЕ хотите удалять, как ко второму, так и к третьему аргументу.Я добавил строчную букву z, но вы можете добавить что угодно (точку, цифру 0, что угодно - просто убедитесь, что вы добавляете один и тот же символ в начале обоих аргументов)

... translate (input_string, 'z ', 'z')    ....

Например,:

select translate('  @','z ','z') from dual;

TRANSLATE('@','Z','Z')
------------------------
@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...