#oracle #regexp-like
#Oracle #подобное регулярному выражению
Вопрос:
Как создать регулярное выражение Oracle, чтобы проверить, содержит ли данная строка как число, так и алфавит и не содержит ли она специальных символов. Например,
если строка похожа на ‘kjds327’, она должна возвращать true
если строка ‘dkfsdsf’ или ‘132564’ или ‘asjv @3 #34342fd’, она должна возвращать false
Комментарии:
1. Я отредактировал ваш пост, чтобы удалить все ссылки на pl / sql. Это не другое название Oracle SQL — и ваш вопрос не имеет ничего общего с pl / sql.
Ответ №1:
Вы можете использовать REGEXP_LIKE
следующее:
select * from your_table
where regexp_like(your_column,'([a-zA-Z][0-9] )|([0-9][a-zA-Z] )')
and not regexp_like(your_column,'[^a-zA-Z0-9]')
Вы можете использовать CASE
оператор с regexp
SELECT
предложением this in, если хотите получить true и false в результате.
Комментарии:
1. Для вашего первого шаблона регулярных выражений вы можете просто упростить
REGEXP_LIKE(col, '[a-z][0-9]|[0-9][a-z]', 'i')
, используя более простой шаблон в режиме без учета регистра.2. Да. Это также можно сделать @TimBiegeleisen
Ответ №2:
Вы можете выполнить три вызова REGEXP_LIKE
для каждого требуемого утверждения:
SELECT *
FROM yourTable
WHERE
REGEXP_LIKE(col, '[A-Za-z]') AND -- contains alphabet
REGEXP_LIKE(col, '[0-9]') AND -- contains number
NOT REGEXP_LIKE(col, '[^A-Za-z0-9]'); -- no special character
Обратите внимание, что здесь я предполагаю, что «специальный» символ — это любой не буквенно-цифровой символ.
Ответ №3:
Для этой задачи вам нужно только одно регулярное выражение.
Минутное размышление покажет, что строка, которая должна содержать по крайней мере одну букву и хотя бы одну цифру и содержит ТОЛЬКО буквы и цифры, должна содержать либо букву, за которой сразу следует цифра, либо цифру, за которой сразу следует буква. Я не буду тратить на это много времени, поскольку это вопрос базовой логики (а не программирования Oracle SQL).
С этим пониманием решение становится ясным. Вам нужно что-то вроде этого (с использованием выражений в скобках POSIX). Не забудьте привязки ^
и $
убедитесь, что сопоставлена вся строка, а не только ее часть.
with
sample_inputs(string) as (
select 'kjds327' from dual union all
select 'dkfsdsf' from dual union all
select '132564' from dual union all
select 'asjv@3#34342fd' from dual union all
select null from dual union all
select '8B' from dual
)
select string,
case when regexp_like(string,
'^[[:alnum:]]*(([[:alpha:]][[:digit:]])|([[:digit:]][[:alpha:]]))[[:alnum:]]*
)
then 'true' else 'false' end as test_result
from sample_inputs
;
STRING TEST_RESULT
-------------- -----------
kjds327 true
dkfsdsf false
132564 false
asjv@3#34342fd false
false
8B true