2013-01-02 103 views
5

我有一個housenumber此示例表在我的PostgreSQL 9.1行:如何刪除不能被強制轉換爲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') 
; 

現在我要整列「housenr」轉換爲INT場。 SQL中有沒有辦法只從可以被轉換的列中轉換這些行。在mytable中,除了「housenr」= 99/1之外,其他每行都是這樣。
喜歡的東西:對於每一個ROW IF :: INT可以投ELSE行刪除表

+0

該字段*是否爲* int?您將其定義爲「文本」... – Gaffi

+0

但是「99/1」可能是有效的門牌號碼。 – Taryn

+0

我必須在進一步的步驟中計算這些數字(將它們彼此相減)。每個字段類型都可以,我可以執行這些計算。 @ bluefeet:這沒關係。如果你可以將99/1轉換爲99,那麼完美的將 – zehpunktbarron

回答

8

您可以使用正則表達式來評估你的列值,以確定它是否是數字:

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

這裏是SQLFiddle:

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

這裏是〜和〜PostgreSQL文檔!

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

+0

+1偉大的這適用於所有場景,以避免除數字之外的任何其他:) – bonCodigo

+0

+1這是偉大的。正是我在尋找的東西! – zehpunktbarron

+0

很高興我可以幫助:) – CodeLikeBeaker

0

你可以做一個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 
    ; 

使用regex用情況下返回一個0時田是不是int

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

@ C.B。上面的代碼實際上假設您的* removable *'house number'帶有'/'。如果你需要更多的特殊字符進行檢查,而是使用'正則表達式';) – bonCodigo

相關問題