Tôi chỉ đang vật lộn với một vấn đề tương tự bản thân mình, nhưng không muốn chi phí cho một chức năng. Tôi đã nghĩ ra truy vấn sau:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres viết tắt các điều kiện của nó, vì vậy bạn sẽ không nhận được bất kỳ số không phải số nguyên nào đánh vào ::số nguyên của bạn. Nó cũng xử lý các giá trị NULL (chúng sẽ không khớp với regexp).
Nếu bạn muốn các số không thay vì không chọn, thì câu lệnh CASE sẽ hoạt động:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;