原谅我,如果这个问题是在另一张票上解决的...我一直在寻找,但似乎找不到合适的解决方案...SQL检查子串的限制
我是创建一张桌子。除了最后一个字符可能是短划线之外,列'Creditor'一直是数字。
这意味着像'1234-','92846293'等等的例子是有效的,'12354-53','12345K'是无效的。 字符串长度不固定(除了它是varchar(50))。
我不知道如何创建检查约束。
请帮忙!
原谅我,如果这个问题是在另一张票上解决的...我一直在寻找,但似乎找不到合适的解决方案...SQL检查子串的限制
我是创建一张桌子。除了最后一个字符可能是短划线之外,列'Creditor'一直是数字。
这意味着像'1234-','92846293'等等的例子是有效的,'12354-53','12345K'是无效的。 字符串长度不固定(除了它是varchar(50))。
我不知道如何创建检查约束。
请帮忙!
你没有声明你的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]+)\-$'
很可能是相同的。
我不是RegEx专家,但是看到最终字符是可选的,不应该是:^([0-9] +) - ?$ – weenoid 2012-04-24 13:42:33
@weenoid:对。我误读“可能”为“必须”;)。谢谢 – 2012-04-24 13:43:32
对于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-]')
谢谢您的答复。
关于'%[^0-9]%'
的提议对我来说是一个很好的开眼界,因为我以前不知道^
算子。
我做了两个版本的所需约束。一个使用“仅”AND,OR,子串和isnumeric。没有花哨的指数或排除。等了太久。 另一个版本由AND,OR,子串和insmuric组成,但包含了所提议的^操作。看起来好多了。
然后,最后我去了第三个解决方案:-) 在数据库中添加了一个bool列,RequiresCreditorValidation,并在我的C#代码中实现了一个正则表达式。
对于希望从结果检查中受益的其他人,他们在这里。 与 “丑” 一个开始:
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;
谢谢大家好,合格,快速作出回应。
这通常不是您可以使用检查约束来做的事情......当然不是在ANSI SQL中。你在使用哪个平台? – 2012-04-24 13:31:01