Поскольку вы создаете столбец в наборе результатов, необходимо, чтобы создаваемый столбец имел один тип. В вашем случае вы преобразуете определенные значения в десятичное, что означает, что ваш столбец должен содержать два типа (varchar и decimal), и это не сработает.
Поскольку по крайней мере одно из ваших значений является varchar , они все должны быть (поскольку varchar не всегда может быть приведен к другим типам, таким как decimal или date или int или what-have-you).
Рассмотрим:
user=# SELECT CAST('1' AS DECIMAL(12,2));
numeric
---------
1.00
(1 row)
user=# SELECT CAST(CAST('1' AS DECIMAL(12,2)) AS VARCHAR(100));
varchar
---------
1.00
(1 row)
Итак, мы преобразовали строковый литерал 1
в десятичное число. База данных добавляет два десятичных знака в представлении этого десятичного числа, как и ожидалось. Затем мы возвращаем эту вещь обратно в varchar()
, генерируя строковый литерал с двумя целыми десятичными разрядами.
Использование этого в вашем SQL (изменилось касание, так как я на postgres, а не на красное смещение):
user=# WITH mytable AS (SELECT 'car' as value UNION SELECT '1')
SELECT (CASE WHEN REGEXP_REPLACE(value, '^[-+]?[0-9]*\.?[0-9]+$', '')=value
THEN value
ELSE CAST(CAST(value AS DECIMAL(12,2)) AS VARCHAR(100))
END) AS newvalue
FROM mytable;
newvalue
----------
1.00
car
(2 rows)