2013-01-02 12 views
5

Tôi có bảng mẫu này với một Số nhà trong postgresql của tôi 9.1:Làm thế nào để xóa hàng mà không thể được đúc để INT

drop table if exists mytable; 
create table mytable(road_id int, housenr text); 
insert into mytable(road_id, housenr) values 

('11', '1'), 
('22', '12'), 
('33', '99/1'), 
('44', '88'), 
('55', '2'), 
('66', '28'), 
('77', '29') 
; 

Bây giờ tôi phải chuyển đổi các cột toàn bộ "housenr" vào một trường INT . Có cách nào trong SQL để chỉ đúc các hàng này từ cột có thể được đúc. Trong mytable, đây sẽ là mỗi hàng ngoại trừ hàng có "housenr" = 99/1.
Cái gì như: FOR EACH ROW NẾU :: int LÀ CÓ THỂ dàn diễn viên hàng ELSE BỎ TỪ BẢNG

+0

Trường đó * có * là 'int'? Bạn định nghĩa nó là 'văn bản' ... – Gaffi

+0

Nhưng' 99/1' có thể là số nhà hợp lệ. – Taryn

+0

Tôi phải tính toán các con số này trong một bước xa hơn (trừ chúng ra khỏi nhau). Mỗi loại trường sẽ là ok, trong đó tôi có thể thực hiện các tính toán này. @ bluefeet: điều này không quan trọng. Nếu bạn có thể chuyển đổi 99/1 thành 99 nó sẽ hoàn hảo để – zehpunktbarron

Trả lời

8

bạn có thể sử dụng regex để đánh giá giá trị cột của bạn để xác định xem nó là số:

select * FROM MyTable where (housenr !~ '^[0-9]+$') 

Đây là SQLFiddle:

http://sqlfiddle.com/#!1/d2ff3/9

Dưới đây là tài liệu PostgreSQL trên ~ và ~!

http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-POSIX-TABLE

+0

+1 Tuyệt vời, công việc này cho tất cả các trường hợp để tránh bất kỳ điều gì khác ngoài chữ số :) – bonCodigo

+0

+1 đây là TUYỆT VỜI. Chính xác những gì tôi đang tìm kiếm! – zehpunktbarron

+0

Vui vì tôi có thể giúp :) – CodeLikeBeaker

0

Bạn có thể làm một case when

select * from (
    select roadid, case when 
    instr(housenr,"/") > 0 then 0 else cast(housenr as int) end) as housenr_new 
    from mytable) t 
where t.housenr_new <> 0 
    ; 

Sử dụng một regex với trường hợp khi trở về 0 khi lĩnh vực này không phải là int

SELECT roadid, CASE WHEN housenr ~ E'^\\d+$' 
THEN housenr::integer ELSE 0 END as housenr_new 
FROM mytable; 
+0

@ C.B. mã trên được cung cấp thực sự giả định rằng số * nhà * có thể tháo rời của bạn đi kèm với một '/'. Nếu bạn cần nhiều ký tự đặc biệt hơn để được kiểm tra thì hãy sử dụng 'regex';) – bonCodigo