子字符串上的SQL检查约束

子字符串上的SQL检查约束,sql,substring,check-constraints,Sql,Substring,Check Constraints,原谅我,如果这个问题在另一张票上解决了,那么。。。我一直在寻找,但似乎找不到正确的解决方案 我正在创建一个表。“债权人”列始终是数字,但最后一个字符可能是破折号 这意味着“1234-”、“92846293”等示例有效,而“12354-53”、“12345K”无效。 字符串长度不是固定的(除非它是varchar(50)) 我不知道如何创建检查约束 请帮忙 您没有说明您的DBMS。对于PostgreSQL,这将是: alter table foo add constraint check_cr

原谅我,如果这个问题在另一张票上解决了,那么。。。我一直在寻找,但似乎找不到正确的解决方案

我正在创建一个表。“债权人”列始终是数字,但最后一个字符可能是破折号

这意味着“1234-”、“92846293”等示例有效,而“12354-53”、“12345K”无效。 字符串长度不是固定的(除非它是varchar(50))

我不知道如何创建检查约束


请帮忙

您没有说明您的DBMS。对于PostgreSQL,这将是:

alter table foo 
  add constraint check_creditor check (creditor ~ '^([0-9]+)\-?$');
alter table foo 
   add constraint check_creditor check (regexp_like(creditor, '^([0-9]+)\-?$'))
对于Oracle而言,这将是:

alter table foo 
  add constraint check_creditor check (creditor ~ '^([0-9]+)\-?$');
alter table foo 
   add constraint check_creditor check (regexp_like(creditor, '^([0-9]+)\-?$'))
如果您的DBMS支持正则表达式,则需要使用DBMS的语法来检查这一点。正则表达式本身^([0-9]+)\-$”很可能是相同的。

对于SQL Server:

测试1:除最后一个字符外,所有字符都是数字字符(或者,不存在非数字字符):

测试2:最后一个字符是数字或破折号:

CHECK ( SUBSTRING(Creditor, LEN(Creditor), 1) LIKE '%[0-9-%]' )
以上假设
债权人
不能为空字符串,即

CHECK ( LEN(Creditor) > 0 )

只是为了好玩:

CHECK ( REVERSE(CAST(REVERSE(Creditor) + REPLICATE(0, 50) AS CHAR(50))) 
           LIKE REPLICATE('[0-9]', 49) + '[0-9-]' )

谢谢你的回复

关于
'%[^0-9]%
的建议让我大开眼界,因为我以前不认识
^
操作员

我做了两个版本的所需约束。一个使用“仅”和,或,子字符串和isnumeric。没有花哨的索引或排除。太长了。 另一个版本由AND、OR、子字符串和insmuric组成,但包含建议的^操作。看起来好多了

最后,我提出了第三种解决方案:——) 在DB上添加了一个bool列,RequiresCreditorValidation,并在我的C#代码中实现了一个正则表达式

对于希望从结果检查中受益的其他人,他们在这里。 从“丑陋”开始:

第二条:

CHECK ( (SUBSTRING(val, 1, DATALENGTH(val) - 1) NOT LIKE '%[^0-9]%') AND 
(SUBSTRING(val, DATALENGTH(val),1) LIKE '%[0-9-]') AND (DATALENGTH(val) > 0) 
AND SUBSTRING(val, 1,1) NOT IN ('+','-') )
然后是正则表达式:

var allButLast = kreditorId.Substring(0, kreditorId.Length - 1);
        if (Regex.Match(allButLast, "[^0-9]").Success)
            return false;
        if (!kreditorId.EndsWith("-"))
            if (Regex.Match(kreditorId, "[^0-9]").Success)
                return false;
        return true;

感谢大家的良好、合格和快速回复。

这通常不是您可以通过检查约束来完成的。。。当然不是在ANSI SQL中。您使用的是什么平台?我不是正则表达式专家,但鉴于最后一个字符是可选的,是否应该是:^([0-9]+)-$