原谅我,如果这个问题在另一张票上解决了......我一直在寻找,但似乎找不到合适的解决方案......
我正在创建一个表。列'Creditor'一直是数字,除了最后一个char可能是破折号。
这意味着'1234-','92846293'等示例有效,'12354-53','12345K'无效。 字符串长度不固定(除了它是一个varchar(50))。
我不知道如何创建检查约束。
请帮忙!
答案 0 :(得分:2)
您没有说明您的DBMS。对于PostgreSQL,这将是:
alter table foo
add constraint check_creditor check (creditor ~ '^([0-9]+)\-?$');
对于Oracle,这将是:
alter table foo
add constraint check_creditor check (regexp_like(creditor, '^([0-9]+)\-?$'))
如果您的DBMS支持正则表达式,则需要使用DBMS的语法来检查它。正则表达式本身'^([0-9]+)\-$'
很可能是相同的。
答案 1 :(得分:1)
感谢您的回复。
关于'%[^0-9]%'
的提案让我大开眼界,因为之前我不认识^
运营商。
我做了两个版本的必需约束。一个使用“仅”AND,OR,子串和isnumeric。没有花哨的指数或排除。太久了。 另一个版本由AND,OR,子串和insmuric组成,但包含了提议的^操作。看起来好多了。
然后,最后,我采用了第三种解决方案:-) 在DB,RequiresCreditorValidation上添加了一个bool列,并在我的C#代码中实现了一个Regex。
对于其他希望从最终检查中受益的人,他们在这里。 从“丑陋”开始:
CHECK ((val NOT IN ('+','-') AND (ISNUMERIC(val) = 1) OR
(ISNUMERIC(SUBSTRING(val, 1, DATALENGTH(val) -1))) = 1) AND
((SUBSTRING(val, (DATALENGTH(val)),1) LIKE '[0-9]') OR
(SUBSTRING(val, DATALENGTH(val),1) = '-')) AND
(SUBSTRING(val, 1, 1) NOT IN ('+','-')) )
第二个:
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;
感谢所有人提供优质,合格和快速的回复。
答案 2 :(得分:0)
对于SQL Server:
测试1:除了最后一个字符之外的所有字符都是数字(或者,不存在非数字字符):
CHECK ( SUBSTRING(Creditor, 1, LEN(Creditor) - 1) NOT LIKE '%[^0-9]%' )
测试2:最后一个字符是数字或破折号:
CHECK ( SUBSTRING(Creditor, LEN(Creditor), 1) LIKE '%[0-9-%]' )
以上假设Creditor
不能为空字符串,即
CHECK ( LEN(Creditor) > 0 )
只是为了好玩:
CHECK ( REVERSE(CAST(REVERSE(Creditor) + REPLICATE(0, 50) AS CHAR(50)))
LIKE REPLICATE('[0-9]', 49) + '[0-9-]' )