---- Route lookup SELECT route, rid, did, description, country, cinit, cinc, pinit, pinc, rate, cost, capacity INTO dest FROM routes WHERE rid = ANY((SELECT routes FROM groups WHERE gid = client.gid AND active)::varchar[]) AND ((route = SUBSTR(client.dialed, 1, 1) AND LENGTH(route) = 1) OR (route = SUBSTR(client.dialed, 1, 2) AND LENGTH(route) = 2) OR (route = SUBSTR(client.dialed, 1, 3) AND LENGTH(route) = 3) OR (LENGTH(route) >= 4 AND SUBSTR(route, 1, 4) = SUBSTR(client.dialed, 1, 4) AND (client.dialed LIKE (route || '%')))) AND active ORDER BY route DESC, cost ASC LIMIT 1; Table "public.routes" Column | Type | Modifiers -------------+-------------------+----------- route | character varying | lata | character varying | ocn | character varying | rate | double precision | cost | double precision | cinit | integer | cinc | integer | pinit | integer | pinc | integer | city | character varying | state | character varying | country | character varying | description | character varying | rid | character varying | did | integer | capacity | integer | active | boolean | Indexes: "routes_idx1" btree (substr(route::text, 1, 1)) WHERE length(route::text) = 1 "routes_idx2" btree (substr(route::text, 1, 2)) WHERE length(route::text) = 2 "routes_idx3" btree (substr(route::text, 1, 3)) WHERE length(route::text) = 3 "routes_idx4" btree (substr(route::text, 1, 4)) WHERE length(route::text) >= 4