以下应该在几个不同的系统中工作:
SELECT *
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'
这种方法确实可以匹配 P2343、P23423JUNK 和其他类似文本,但要求格式为 A0000*。
现在,如果 OP 暗示第一个位置的格式是一个字符,并且所有后续位置都是数字,如 A0+,那么使用以下(在 SQL Server 和许多其他数据库系统中):
SELECT *
FROM TheTable
WHERE SUBSTRING(Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(Data, 2, LEN(Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(Data) >= 5
要将其合并到 SQL Server 2008 函数中,因为这似乎是您最想要的,您可以编写:
CREATE FUNCTION ufn_IsProperFormat(@data VARCHAR(50))
RETURNS BIT
AS
BEGIN
RETURN
CASE
WHEN SUBSTRING(@Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(@Data, 2, LEN(@Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(@Data) >= 5 THEN 1
ELSE 0
END
END
...并像这样调用它:
SELECT *
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1
...此查询需要针对 Oracle 查询进行更改,因为 Oracle 似乎不支持 LIKE 子句中的括号表示法:
SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}$')
这是 gbn 在他的回答中所做的扩展,但是这些版本允许在没有 OR 条件的情况下改变字符串长度。
编辑:更新以支持 SQL Server 和 Oracle 中的示例,以确保格式 A0+,以便 A1324、A2342388 和 P2342 匹配,但 A2342JUNK 和 A234 不匹配。
Oracle REGEXP_LIKE 代码是从 Mark 的帖子中借用的,但已更新为支持 4 个或更多数字。
添加了实现这些技术的自定义 SQL Server 2008 方法。