SELECT *
FROM activities_t
WHERE CASE WHEN activity_code ~ '^\d+$' -- only digits
THEN activity_code::int BETWEEN 10012 AND 10015 END;
Оболочка CASE
исключает исключение. Рассматриваются только строки, состоящие только из цифр. (Так что без пробелов тоже!)
ELSE
не требуется, поскольку CASE
по умолчанию равно NULL
и только TRUE
соответствует условию WHERE
.
Конечно, это не может использовать какой-либо простой индекс для activity_code
.
Если вам нужна более высокая производительность , либо очистите свой дизайн таблицы, либо, если это не вариант, создайте индекс выражения:
CREATE INDEX foo_idx ON activities_t((CASE WHEN activity_code ~ '^\d+$'
THEN activity_code::int END));
И сопоставьте выражение в вашем запросе:
SELECT *, CASE WHEN activity_code ~ '^\d+$' THEN activity_code::int END
FROM activities_t
WHERE CASE WHEN activity_code ~ '^\d+$'
THEN activity_code::int END BETWEEN 10012 AND 10015;
Это немного отличается от первого запроса и будет немного дороже, если не будет запускать сканирование индекса.