You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Firebird 2.5降级至2.1:将Similar to替换为Like实现域定义

适配Firebird 2.1的CODET域定义改写

没问题,Firebird 2.1确实不支持SIMILAR TO正则匹配,但我们可以通过LIKE结合字符范围、固定位置匹配,完全复刻你原来的所有校验逻辑。下面是改写后的完整域定义:

CREATE DOMAIN CODET AS varchar(16) NOT NULL 
CHECK (
    char_length(value) = 16 
    AND value LIKE 'G[CME] [1-6] E[PSL] [A-E] [0-9][0-9] [0-9][0-9][0-9]'
    AND substring(value from 14 for 3) > '000'
) COLLATE NONE;

规则对应拆解

我把原SIMILAR TO的正则规则逐段转换成了Firebird 2.1LIKE支持的模式:

  • 原规则第1位[G]{1} → 直接写G(单字符匹配,无需重复次数标记)
  • 原规则第2位[C,M,E]{1}[CME]LIKE支持方括号枚举字符,逗号可省略)
  • 所有空格位置直接保留在LIKE模式中,和原规则一致
  • 原规则第4位[1-6]{1}[1-6]LIKE支持数字范围匹配)
  • 原规则第6-7位[E]{1}[P,S,L]{1}E[PSL](固定E后接P/S/L中的任意一个)
  • 原规则第9位[A-E]{1}[A-E]LIKE支持字母范围匹配,等价于[ABCDE]
  • 原规则的两位数字段[0-9]{1}[0-9]{1}[0-9][0-9](匹配任意两位数字)
  • 原规则的三位数字段[0-9]{1}[0-9]{1}[0-9]{1}[0-9][0-9][0-9](匹配任意三位数字)

额外注意点

  • Firebird的LIKE原生支持上述字符范围和枚举模式,完全能替代原正则的单字符校验逻辑
  • 原校验中substring(value from 14 for 3) > '000'的逻辑保持不变,因为这部分和正则无关,直接保留即可
  • COLLATE NONE也沿用原设置,确保字符匹配不依赖特定排序规则

内容的提问来源于stack exchange,提问作者Moh Lamine

火山引擎 最新活动