Поиск с использованием подстановочных знаков для диапазона чисел c - PullRequest
5 голосов
/ 18 июня 2020

Я пытаюсь отфильтровать столбец (plan_name), который имеет целые rnet планы клиентов. Например (200 ГБ Fast Unlimited, бесплатный дополнительный почтовый ящик, неограниченный VDSL ...). Я специально хочу отфильтровать планы, в которых нет номеров . Столбец имеет тип varchar2, и я запрашиваю базу данных Oracle. Я написал следующий код:

SELECT *
FROM   plans
WHERE  plan_name NOT LIKE '%[0-9]%'

Однако этот код по-прежнему возвращает планы вроде 200 ГБ быстро, в которых есть числа? Кто-нибудь может объяснить, почему это так?

1 Ответ

3 голосов
/ 18 июня 2020

Oracle Синтаксис like не поддерживает тип сопоставления с образцом, который вы пытаетесь. Это SQL синтаксис сервера. Oracle интерпретирует образец как литеральный '[0-9]' (что, очевидно, что-то вроде '200GB' не соответствует).

Однако, в отличие от SQL Server, Oracle имеет правильную поддержку для регулярного выражения с помощью функций regexp_*. Если вам нужны значения, которые не содержат di git, вы можете сделать:

where not regexp_like(plan_name, '\d')
...