8

我的 postgresql 9.1 中有这个带有门牌号的示例表:

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 之外的每一行。
类似于: FOR EACH ROW IF ::int IS POSSIBLE 强制转换行 ELSE REMOVE FROM TABLE

4

2 回答 2

12

您可以使用 REGEX 来评估您的列值以确定它是否为数字:

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

于 2013-01-02T17:28:16.327 回答
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当字段不是时,使用with case 返回 0int

SELECT roadid, CASE WHEN housenr ~ E'^\\d+$' 
THEN housenr::integer ELSE 0 END as housenr_new
FROM mytable;
于 2013-01-02T17:26:50.683 回答