Postgres конвертировать строку в число - PullRequest
2 голосов
/ 12 сентября 2009

У меня есть многомиллионная таблица строк с полем varchar. Некоторые из строк varchar являются числами с плавающей запятой. Нет никаких ограничений на другие поля, которые могут полностью изолировать, какие строки являются числами, а какие нет. Я хочу создавать запросы с ORDER BY в строках с числовым значением в поле varchar (игнорируя нечисловые значения). Я не могу просто вызвать MyField :: numeric, потому что это приводит к появлению нечисловых строк.

Я подумал о двух основных вариантах:
(a) Используйте регулярное выражение, чтобы определить, является ли строка числовой.
(b) Перехватить исключение приведения и вернуть ноль для всех нечисловых значений.

Скорость имеет решающее значение. Я попробовал вариант (а), и это мучительно медленно. Я создал хранимую процедуру, чтобы использовать регулярные выражения для проверки значения перед приведением. Номера не возвращаются как ноль. Я создал индекс, используя эту хранимую процедуру. Регулярное выражение очень дорого. Но мне интересно, стоит ли даже пытаться поймать исключение.

Есть ли простой способ, чтобы MyField :: numeric возвращал нули для нечисловых данных? Любые предложения, чтобы сделать это быстрее?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 сентября 2009

Для скорости я бы пошел с решением сохранить отдельный столбец с числовым типом, который обновляется триггером. Нули не теряют места. В противном случае решение с хранимой процедурой (или должно быть достаточно выражения case), которое проверяет значение и затем приводит его к правильному звучанию. Поймать исключения, вероятно, будет самым дорогим решением из всех.

1 голос
/ 12 сентября 2009

Исправлена ​​ли схема или вы можете ее изменить? В частности, вы могли бы добавить еще один (обнуляемый) столбец для хранения значения с плавающей запятой, если оно есть? Тогда триггер для вставки / обновления может убедиться, что числовой столбец всегда имеет правильное значение. Это предполагает, что вы будете делать запросы чаще, чем вставлять / обновлять курс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...