compares two strings' soundex values for similarity, from Kris Jurka.
Also mark the text_soundex() function as STRICT, to avoid crashing
on NULL input.
* Folded existing soundex contrib into this one. Renamed text_soundex() (C function)
* to soundex() for consistency.
*
+ * difference()
+ * ------------
+ * Return the difference between two strings' soundex values. Kris Jurka
+ *
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without a written agreement
* is hereby granted, provided that the above copyright notice and this
beyond English names (or the English pronunciation of names), and
it is not a linguistic tool.
+When comparing two soundex values to determine similarity, the
+difference function reports how close the match is on a scale
+from zero to four, with zero being no match and four being an
+exact match.
+
The following are some usage examples:
SELECT soundex('hello world!');
+SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
+SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
+SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');
+
CREATE TABLE s (nm text)\g
insert into s values ('john')\g
insert into s values ('joan')\g
insert into s values ('wobbly')\g
+insert into s values ('jack')\g
select * from s
where soundex(nm) = soundex('john')\g
WHERE text_sx_eq(nm,'john')\g
SELECT *
-from s
-where s.nm #= 'john';
+FROM s
+WHERE s.nm #= 'john';
+
+SELECT *
+FROM s
+WHERE difference(s.nm, 'john') > 2;
+
++count;
}
}
+
+PG_FUNCTION_INFO_V1(difference);
+
+Datum
+difference(PG_FUNCTION_ARGS)
+{
+ char sndx1[SOUNDEX_LEN+1], sndx2[SOUNDEX_LEN+1];
+ int i, result;
+
+ _soundex(_textout(PG_GETARG_TEXT_P(0)), sndx1);
+ _soundex(_textout(PG_GETARG_TEXT_P(1)), sndx2);
+
+ result = 0;
+ for (i=0; i<SOUNDEX_LEN; i++) {
+ if (sndx1[i] == sndx2[i])
+ result++;
+ }
+
+ PG_RETURN_INT32(result);
+}
extern Datum levenshtein(PG_FUNCTION_ARGS);
extern Datum metaphone(PG_FUNCTION_ARGS);
extern Datum soundex(PG_FUNCTION_ARGS);
+extern Datum difference(PG_FUNCTION_ARGS);
/*
* Soundex
-- Adjust this setting to control where the objects get created.
SET search_path = public;
-CREATE FUNCTION levenshtein (text,text)
-RETURNS int
+CREATE FUNCTION levenshtein (text,text) RETURNS int
AS 'MODULE_PATHNAME','levenshtein'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
-CREATE FUNCTION metaphone (text,int)
-RETURNS text
+CREATE FUNCTION metaphone (text,int) RETURNS text
AS 'MODULE_PATHNAME','metaphone'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION soundex(text) RETURNS text
AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION text_soundex(text) RETURNS text
AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C';
+LANGUAGE C IMMUTABLE STRICT;
+
+CREATE FUNCTION difference(text,text) RETURNS int
+AS 'MODULE_PATHNAME', 'difference'
+LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION dmetaphone (text) RETURNS text
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone';
+AS 'MODULE_PATHNAME', 'dmetaphone'
+LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION dmetaphone_alt (text) RETURNS text
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone_alt';
+AS 'MODULE_PATHNAME', 'dmetaphone_alt'
+LANGUAGE C IMMUTABLE STRICT;