@k79x

Как получить таблицу с верными данными и с исключениями?

Есть запрос:
SELECT * FROM planet_osm_point WHERE place = 'town' AND population::int > 4000

Проблема заключается в том, что population не всегда integer. Встречаются значения "38 500" и "100-200". Подскажите, как достать все записи, пропуская неподходящие, а спорные (где значение - строка) занести в другую таблицу?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 2
erge
@erge
Примус починяю
Используйте регулярное выражение для отбора числовых значений в 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
;
Ответ написан
iMedved2009
@iMedved2009
Не люблю людей
SELECT * FROM planet_osm_point WHERE place = 'town' AND population ~ '^[\d]+$' AND population::int > 4000;

SELECT * FROM planet_osm_point WHERE population !~ '^[\d]+$';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы