用于验证 Adventureworks 邮政编码的 T-SQL Case 语句

问题描述 投票:0回答:1

我需要案例声明来验证邮政编码的格式是否正确。

我们假设如果 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

sql-server tsql
1个回答
0
投票
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
)。 但请注意,这并不代表实际使用的邮政编码。 (表中最后一行以空格为前缀,使其无效)。

© www.soinside.com 2019 - 2024. All rights reserved.