Ладно -
Чтобы определить, содержит ли строка произвольной длины только числовые символы (или нет), вы можете использовать повторный CTE.
Обратите внимание, что я не знаю, поддерживает ли ваша СУБД рекурсивные CTE, но это потенциальное решение.Кроме того, я не уверен в влиянии на производительность - однако, он действительно удаляет многократный эффект CASE
(И вообще, почему это не фактическое числовое поле?).
Итак ... Длятаблица, которая выглядит следующим образом:
id ch
================
1 1234567890
2 asdg
Этот оператор возвращает все строки, которые содержат только числовые символы (любой длины):
WITH splitstring (id, chard, start, orig) as (
SELECT id, SUBSTRING(ch, 1, 1), 1, ch
FROM chartable
UNION ALL
SELECT id, SUBSTRING(orig, start + 1, 1), start + 1, orig
FROM splitstring
WHERE LENGTH(orig) > start)
SELECT *
FROM chartest as a
WHERE NOT EXISTS (SELECT '1'
FROM splitstring as b
WHERE a.id = b.id
AND chard NOT BETWEEN '0' AND '9')
Без некоторыхВ более широком контексте довольно сложно точно знать, чего вы пытаетесь достичь.Однако это должно быть адаптировано к вашим потребностям.
(Как примечание: DB2 для iSeries, похоже, также не поддерживает регулярные выражения ...)