正则表达式作为SQL模式的一部分

时间:2012-05-08 20:48:43

标签: sql regex database schema

让我们假设我有一个关系数据库,其中包括我想存储员工姓名及其识别字符串。严格定义标识字符串的格式:它是三个大写字母字符,后跟一个破折号,后跟一个四位数字。

问题:任何关系数据库是否允许定义特定文本字段必须符合的正则表达式?就像在我的例子中一样,让数据库针对简单的正则表达式检查员工ID的所有值是很好的,而不是在UI级别上进行检查。

另一个问题:如果我遇到这样的问题(即根据一组额外的约束来验证字段值的必要性),这是否意味着我的模式是非规范化的,我应该修复它?

3 个答案:

答案 0 :(得分:2)

是的,您可以使用检查约束来执行此操作。

显然,对此的支持因供应商而异。某些数据库对正则表达式的支持有限或不支持,有些数据库不支持检查约束。

答案 1 :(得分:0)

您可以通过对字段的约束来进行检查。这取决于您使用的数据库。在SQL Server中,您可能必须使用以下语法:

check (len(EmpId) = 7 and left(EmpId, 3) between 'AAA' and 'ZZZ' and
       substring(EmpId, 4) = '-' and isnumeric(right(EmpId, 4)) = 1 

首先,检查约束进入表创建,前面是“CONSTRAINT语句。

其次,正则表达式将是一种更简洁的方法。但是,并非所有数据库都支持它们。

第三,上述并不完美。例如,它允许前B1个字符为'B1B'。更复杂的逻辑可以解决这个问题。

最后,为了保证大写,您可能需要将比较的排序规则设置为区分大小写。

答案 2 :(得分:0)

关于你的第二个问题,这取决于你。 (当然这取决于它。它总是取决于。)如果你总是使用你的员工识别字符串作为一个“整体”值,那么它是标准化的。如果你发现你经常将它们分成“第一和第二”部分(3个字符,4个数字),那么你就是打破了第一个正常形式。 (粗略地说,一列中有两个事实,应将它们分成各自的列。)

假设正确的规范化,在我看来,您必须依赖数据库来确保数据处于正确的形式,这引发了对数据源完整性的质疑。为什么在传递到数据库之前,数据没有被检查,清理并放入正确形成的? RDBMS确实擅长存储,排序和检索数据,但它们在处理复杂算法方面并不那么热门。它不是他们想要的。您可以在数据库中执行此操作,是的,但有更好的方法可以执行此操作。