-- location_extract_countysub_exact(string, stateAbbrev) -- This function checks the place_lookup table to find a potential match to -- the location described at the end of the given string. If an exact match -- fails, a fuzzy match is performed. The location as found in the given -- string is returned. CREATE OR REPLACE FUNCTION location_extract_countysub_exact( fullStreet VARCHAR, stateAbbrev VARCHAR ) RETURNS VARCHAR AS $_$ DECLARE ws VARCHAR; location VARCHAR; tempInt INTEGER; rec RECORD; BEGIN ws := E'[ ,.\n\f\t]'; -- No hope of determining the location from place. Try countysub. IF stateAbbrev IS NOT NULL THEN SELECT INTO tempInt count(*) FROM countysub_lookup WHERE countysub_lookup.state = stateAbbrev AND texticregexeq(fullStreet, '(?i)' || name || '$'); ELSE SELECT INTO tempInt count(*) FROM countysub_lookup WHERE texticregexeq(fullStreet, '(?i)' || name || '$'); END IF; IF tempInt > 0 THEN IF stateAbbrev IS NOT NULL THEN FOR rec IN SELECT substring(fullStreet, '(?i)(' || name || ')$') AS value, name FROM countysub_lookup WHERE countysub_lookup.state = stateAbbrev AND texticregexeq(fullStreet, '(?i)' || ws || name || '$') ORDER BY length(name) DESC LOOP -- Only the first result is needed. location := rec.value; EXIT; END LOOP; ELSE FOR rec IN SELECT substring(fullStreet, '(?i)(' || name || ')$') AS value, name FROM countysub_lookup WHERE texticregexeq(fullStreet, '(?i)' || ws || name || '$') ORDER BY length(name) DESC LOOP -- again, only the first is needed. location := rec.value; EXIT; END LOOP; END IF; END IF; RETURN location; END; $_$ LANGUAGE plpgsql;