暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 需要针对格式验证字符串

ASKTOM 2021-03-17
280

问题描述

嗨,团队,
我需要验证给定格式的给定字符串。我有一张下面的表。

with t as
(
select 'AR' country,8 zip_code_length,'A####AAA' zip_code_format,'B6789CDF' zip_code from dual union all
select 'AR' country,8 zip_code_length,'A####AAA' zip_code_format,'6789CDF' zip_code from dual union all
select 'BR' country,9 zip_code_length,'#####-###' zip_code_format,'12345-678' zip_code from dual union all
select 'BR' country,9 zip_code_length,'#####-###' zip_code_format,'BC345-678' zip_code from dual union all
select 'CA' country,7 zip_code_length,'A#A #A#' zip_code_format,'B2C 8A9' zip_code  from dual union all
select 'CA' country,7 zip_code_length,'A#A #A#' zip_code_format,'BbC CA9' zip_code  from dual union all
select 'CH' country,4 zip_code_length,'####' zip_code_format,'1234' zip_code from dual union all
select 'CH' country,4 zip_code_length,'####' zip_code_format,'123456' zip_code from dual union all
select 'CZ' country,6 zip_code_length,'### ##' zip_code_format,'123 45' zip_code from dual union all
select 'CZ' country,6 zip_code_length,'### ##' zip_code_format,'12345' zip_code from dual union all
select 'EC' country,6 zip_code_length,'A####A' zip_code_format,'B3456C' zip_code from dual union all
select 'EC' country,6 zip_code_length,'A####A' zip_code_format,'BBB56C' zip_code from dual union all
select 'PL' country,6 zip_code_length,'##-###' zip_code_format,'12-345' zip_code from dual union all
select 'PL' country,6 zip_code_length,'##-###' zip_code_format,'12-34567' zip_code from dual
)
select * from t;


我在上述查询中有zip_code_format和zip_code字段。
zip_code_format在不同的表中。

我需要针对zip_code_format字段验证zip_code,并在sql或pl/sql中获得TRUE/FALSE。

我想将zip_code和zip_code_format传递给pl/sql函数,以获得TRUE/FALSE值作为回报。
不知道如何开始查询。所以,我需要一个sql查询的帮助。

预期产出:

country zip_code_length zip_code_format zip_code    validation
AR      8               A####AAA        B6789CDF    TRUE
AR      8               A####AAA        6789CDF     FALSE
BR      9               #####-###       12345-678   TRUE
BR      9               #####-###       BC345-678   FALSE
CA      7               A#A #A#         B2C 8A9     TRUE
CA      7               A#A #A#         BbC CA9     FALSE
CH      4               ####            1234        TRUE
CH      4               ####            123456      FALSE
CZ      6               ### ##          123 45      TRUE
CZ      6               ### ##          12345       FALSE
EC      6               A####A          B3456C      TRUE
EC      6               A####A          BBB56C      FALSE
PL      6               ##-###          12-345      TRUE
PL      6               ##-###          12-34567    FALSE


谢谢你的帮助,

专家解答

我假设

# => 匹配任何数字
A => 匹配任何字母

如果是这样,这里有一种方法:

使用正则表达式将数字转换为 #,将字母转换为A。

然后检查结果字符串是否与您想要的格式匹配:

with t as (
select 'AR' country,8 zip_code_length,'A####AAA' zip_code_format,'B6789CDF' zip_code from dual union all
select 'AR' country,8 zip_code_length,'A####AAA' zip_code_format,'6789CDF' zip_code from dual union all
select 'BR' country,9 zip_code_length,'#####-###' zip_code_format,'12345-678' zip_code from dual union all
select 'BR' country,9 zip_code_length,'#####-###' zip_code_format,'BC345-678' zip_code from dual union all
select 'CA' country,7 zip_code_length,'A#A #A#' zip_code_format,'B2C 8A9' zip_code from dual union all
select 'CA' country,7 zip_code_length,'A#A #A#' zip_code_format,'BbC CA9' zip_code from dual union all
select 'CH' country,4 zip_code_length,'####' zip_code_format,'1234' zip_code from dual union all
select 'CH' country,4 zip_code_length,'####' zip_code_format,'123456' zip_code from dual union all
select 'CZ' country,6 zip_code_length,'### ##' zip_code_format,'123 45' zip_code from dual union all
select 'CZ' country,6 zip_code_length,'### ##' zip_code_format,'12345' zip_code from dual union all
select 'EC' country,6 zip_code_length,'A####A' zip_code_format,'B3456C' zip_code from dual union all
select 'EC' country,6 zip_code_length,'A####A' zip_code_format,'BBB56C' zip_code from dual union all
select 'PL' country,6 zip_code_length,'##-###' zip_code_format,'12-345' zip_code from dual union all
select 'PL' country,6 zip_code_length,'##-###' zip_code_format,'12-34567' zip_code from dual
)
select zip_code, 
       zip_code_format, 
       case
         when regexp_replace ( 
           regexp_replace (
             zip_code, '[0-9]', '#'
           ),
           '[A-Z]', 'A'
         ) = zip_code_format then
           'TRUE'
         else 
           'FALSE'
       end valid
from   t;

ZIP_CODE     ZIP_CODE_FORMAT    VALID   
B6789CDF     A####AAA           TRUE     
6789CDF      A####AAA           FALSE    
12345-678    #####-###          TRUE     
BC345-678    #####-###          FALSE    
B2C 8A9      A#A #A#            TRUE     
BbC CA9      A#A #A#            FALSE    
1234         ####               TRUE     
123456       ####               FALSE    
123 45       ### ##             TRUE     
12345        ### ##             FALSE    
B3456C       A####A             TRUE     
BBB56C       A####A             FALSE    
12-345       ##-###             TRUE     
12-34567     ##-###             FALSE   

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论