This is a slight improvement on the script posted the other day. Uses PATINDEX for pattern match, and checks for forbidden characters D, F, I, O, Q, U.
2007-10-02 (first published: 2002-06-20)
15,451 reads
This is a slight improvement on the script posted the other day. Uses PATINDEX for pattern match, and checks for forbidden characters D, F, I, O, Q, U.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CheckPostalCodeFormat]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[CheckPostalCodeFormat] --GO CREATE FUNCTION dbo.CheckPostalCodeFormat (@PostalCode nvarchar(10)) /****************************************************************************** ** Name: CheckPostalCodeFormat ** Desc: Check the formatting of a postal code matches Canadian standards. ** ** Output Parameters: ** @Result: 0 for no errors ** -1 for an error ** ** Auth: Paul Schlieper ** Date: 15 Jan-2007 *******************************************************************************/RETURNS INTEGER AS BEGIN /* D, F, I, O, Q, and U never used in Canadian postal codes ** Too easily mistaken for 0, 1, E, V by machine readers. ** Also, W and Z are never the first letter in the code. */ RETURN (SELECT CASE WHEN LEFT(@PostalCode, 1) IN ('W', 'Z') THEN -1 WHEN LOWER(REPLACE(@PostalCode, ' ', '')) LIKE '[a-z][0-9][a-z][0-9][a-z][0-9]' AND PATINDEX('%[dfioqu]%', @PostalCode) = 0 THEN 0 ELSE -1 END) END --GO /* -- test -- return 0 for success select dbo.CheckPostalCodeFormat('A1B2C3') select dbo.CheckPostalCodeFormat('H4E 5G6') -- return -1 for failure select dbo.CheckPostalCodeFormat('90210') select dbo.CheckPostalCodeFormat('A11A1A1') select dbo.CheckPostalCodeFormat('W4E 5G6') */