Используйте
регулярное выражение для отбора числовых значений в population
population ~ '^[0-9]+$'
-- Выбираем по population где только число и больше 4000
SELECT *
FROM planet_osm_point
WHERE place = 'town'
AND population ~ '^[0-9]+$'
AND population::int > 4000
-- Отбираем нечисловые значение в population и вставляем в таблицу contr_planet_osm_point
INSERT INTO contr_planet_osm_point
SELECT *
FROM planet_osm_point
WHERE place = 'town'
AND population !~ '^[0-9]+$'
см. пример на
dbfiddle
UPDATE:
по комментариям, для того чтобы "железно" по порядку работало - отбор чисел-> отбор по условию.
SELECT *
FROM (
SELECT *
FROM planet_osm_point
WHERE place = 'town'
AND population ~ '^[0-9]+$'
) t
WHERE population::int > 4000
UPDATE2:
да согласен, с
xukapy, БД может в принципе как угодно выполнить условия в процессе оптимизации, поэтому лучше жестко задавать порядок выполнения.
считаю можно как подзапросом выше, так и как пишут в статье -
PostgreSQL Antipatterns: вычисление условий в SQL
использовать
CASE -
WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
SELECT *
FROM planet_osm_point
WHERE place = 'town'
AND CASE WHEN population ~ '^[0-9]+$' THEN population::int > 4000 ELSE false END
;