Не regexp_like, найти нулевые значения - PullRequest
0 голосов
/ 31 мая 2018

Проверка данных входных данных в промежуточных таблицах перед загрузкой в ​​основные системные таблицы.Поскольку я хочу использовать ту же проверку полей в Apex, я реализовал проверки в виде регулярных выражений, используя 'not regexp_like', чтобы вернуть любое поле, которое не соответствует его шаблону.Однако для обязательного 10-символьного поля я ожидал такой шаблон:

'^. {1,10} $'

, чтобы вернуть любое поле, которое было пустым, с полями, которые были слишкомдолго, это не так, нулевые поля не возвращаются.

Есть ли шаблон регулярного выражения, который будет делать это?

Пример:

    select col
                from (select null col from dual
                            union all
                            select 'A string' from dual)
            where not regexp_like(col, '^.{1,10}$')

Удаление 'not'возвращает 1 строку, как и ожидалось ...

Дело здесь в том, чтобы заставить шаблон найти нулевое значение, не использовать regexp_like для поиска правильных значений и затем исключить их, или использовать NVL в поле.Эта проверка уже достаточно дорогая!

Я предполагаю, что, как и большинство кодов Oracle с нулевым значением, здесь происходит то, что regexp_like видит нулевое значение и, следовательно, возвращает нулевое значение?

Сценарий Java и Java ведут себятаким же образом?

Спасибо

Боб

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Oracle имеет 3 состояния в результате логического выражения: TRUE, FALSE или NULL (неизвестно).

WHERE REGEXP_LIKE( NULL, '.' )

Вернет NULL, а не TRUE илиFALSE.

Отрицание выражения:

WHERE NOT REGEXP_LIKE( NULL, '.' )

также вернет NULL, а не TRUE или FALSE, и, поскольку оно не является TRUE, тогдастрока никогда не будет возвращена.

Вместо этого вам нужно явно проверить значение NULL:

WHERE NOT REGEXP_LIKE( col, '^.{1,10}$' )
OR    col IS NULL

или, проще говоря:

WHERE LENGTH( col ) > 10
OR    col IS NULL
0 голосов
/ 31 мая 2018

Если вам нужно получить только строки с нулем или более 10 символов, вы можете просто использовать:

length(col) > 10 or col is null

О NULL, единственная проверка, на которую вы можете положиться, - is [not] null.

Например:

select length(null) from dual

дает NULL, а не 0.

...