子字符串上的SQL检查约束
原谅我,如果这个问题在另一张票上解决了,那么。。。我一直在寻找,但似乎找不到正确的解决方案 我正在创建一个表。“债权人”列始终是数字,但最后一个字符可能是破折号 这意味着“1234-”、“92846293”等示例有效,而“12354-53”、“12345K”无效。 字符串长度不是固定的(除非它是varchar(50)) 我不知道如何创建检查约束子字符串上的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
请帮忙 您没有说明您的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]+)-$