我需要案例声明来验证邮政编码的格式是否正确。
我们假设如果 Address_Postal Code 列为 NULL,则数据库约束允许 NULL,因此该列不是无效的,不执行任何操作并以 NULL 结束,如果该列不为空,则仅验证 StateProvince_CountryRegionCode = 'US',如果 StateProvince_CountryRegionCode 为不是“US”则不执行任何操作返回 NULL,如果 StateProvince_CountryRegionCode =“US”则验证,如果有效则结束为“有效邮政编码”,如果无效则结束为“无效邮政编码”。我需要 8 小时内有效的代码
可能是下面列出的类似内容。但是,当我取消注释其余代码时,我收到无效语法错误。
,CASE
WHEN [Address_PostalCode] IS NULL --Postal code is Null, end as Null, don't validate
THEN 'Address_PostalCode is null'
--ELSE
--CASE
-- WHEN StateProvince_CountryRegionCode = 'US'
-- THEN --Country is US so Validate
-- WHEN [Address_PostalCode] LIKE '[0-9][0-9][0-9][0-9][0-9]'
-- OR [Address_PostalCode] LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
-- OR [Address_PostalCode] LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
-- THEN 'Valid U.S. Postal Code'
-- ELSE 'Invalid U.S. Postal Code'
-- ELSE
-- END
END AS ValidationResult2
我正在使用来自 Microsoft 下载的 AdventureWorks2008R2 和 AdventureWorksDW2008R2
DECLARE @Table TABLE (ZipCode VARCHAR(10));
INSERT INTO @Table (ZipCode) VALUES
('12345'), ('12345-6789'), ('1234'), ('ABCDE'), (NULL), (' 12345');
SELECT *, CASE WHEN ZipCode IS NULL THEN 'Invalid ZipCode'
WHEN PATINDEX('[0-9][0-9][0-9][0-9][0-9]', ZipCode) > 0 THEN 'Valid Zip'
WHEN PATINDEX('[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', ZipCode) > 0 THEN 'Valid Zip+4'
WHEN PATINDEX('%[^0-9|^-]%', ZipCode) > 0 THEN 'Invalid Zip - invalid character(s)'
ELSE 'Invalid ZipCode'
END
FROM @Table;
线 |邮政编码|(无列名)| |:---|:---| |12345|有效邮编 | |12345-6789|有效邮编+4 | |1234|无效的邮政编码| |ABCDE|无效邮政编码 - 无效字符 | |NULL|无效的邮政编码 | | 12345|无效邮政编码 - 无效字符|
在这里,我们使用
PATINDEX
来查找美国邮政编码的已知模式。它们应该是 5 个数字,或者是 5 个数字后跟一个破折号和四个数字。 (12345
或 12345-6789
)。
但请注意,这并不代表实际使用的邮政编码。 (表中最后一行以空格为前缀,使其无效)。