SELECT 'E01000001'::gsscode ~* '^E01'; ?column? ---------- t (1 row) SELECT 'S01000001'::gsscode ~* '^E01'; ?column? ---------- f (1 row) SELECT 'e01000001'::gsscode ~* '^e01'; ?column? ---------- t (1 row) SELECT 'E01000001'::gsscode ~ '^E01'; ?column? ---------- t (1 row) SELECT 'E01000001'::gsscode ~ '^e01'; -- case sensitive: no match ?column? ---------- f (1 row) SELECT 'E01000001'::gsscode !~ '^S01'; ?column? ---------- t (1 row) SELECT 'E01000001'::gsscode !~* '^s01'; ?column? ---------- t (1 row) SELECT LEFT('E01000001'::gsscode, 3); left ------ E01 (1 row) SELECT LEFT('E01000001'::gsscode, 3) = 'E01'; ?column? ---------- t (1 row) -- LEFT(code,n) = literal can use a plain expression index CREATE TEMP TABLE compat_sample (code gsscode); INSERT INTO compat_sample SELECT ('E01' || lpad(i::text, 6, '0'))::gsscode FROM generate_series(1,20) i; CREATE INDEX ON compat_sample (LEFT(code, 3)); ANALYZE compat_sample; SELECT count(*) FROM compat_sample WHERE LEFT(code, 3) = 'E01'; count ------- 20 (1 row)