Firebird切换自"类似于"到"喜欢"

时间:2018-01-03 14:06:53

标签: sql firebird sql-like

我使用"类似于"创建了一个域名。在firebird 2.5下运行,但现在我必须将我的数据库降级到Firebird 2.1,并且由于该功能似乎不可能。 我想找到用" Like"来表达我的域名的方法。功能,以便它在Firebird 2.1中运行。这是我的域代码:

CREATE DOMAIN CODET
 AS varchar(16)
 NOT NULL
 CHECK (char_length(value)=16
 and
 value SIMILAR TO 
  '[G]{1}[C,M,E]{1} [1-6]{1} [E]{1}[P,S,L]{1} 
  [A-E]{1} [0-9]{1}[0-9]{1} [0-9]{1}[0-9]{1}[0-9]{1}'
  and substring(value from 14 for 3)>'000')
 COLLATE NONE;

1 个答案:

答案 0 :(得分:2)

您可以尝试"翻译"它是按术语计算的,即

  • 第一个是[G]{1},这意味着该值必须以G开头,因此会变为value STARTING WITH 'G'
  • [C,M,E]{1} - 第二个字符必须是C,M或E (value like '_C%')or(value like '_M%')or(value like '_E%')
  • [1-6]{1} - 第四个字符必须是1到6之间的数字,包括。所以SUBSTRING(value FROM 4 FOR 1) BETWEEN '1' AND '6'

等等。然后将它们合并为一个:

...
CHECK ( char_length(value)=16
   and value STARTING WITH 'G'
   and( (value like '_C%')or(value like '_M%')or(value like '_E%') )
   and SUBSTRING(value FROM 4 FOR 1) BETWEEN '1' AND '6'
   ...
)

由于您的字符串是固定长度,并且其中的空格处于固定位置,您可以在单个字词中检查它们,如此

value like '__ _ __ _ __ ___'

即所有非空间位置都标有_,空格位置包含空格字符。

或者你可以使用一些实现similar to操作的UDF。