SQL查询中的有效记录

时间:2010-03-01 18:26:46

标签: sql-server tsql pattern-matching

我有一个包含少量列的表,其中一列是DockNumber。如果他们确认特定格式,我必须显示docknumbers

前五个字符是数字,后跟一个 - 后跟5个字符。最后一个字符应该是alpha。

12345-678V9

如果前5个字符是数字并且有连字符,接下来3个是数字,那么如何检查SQL,最后只有一个是alpha。

8 个答案:

答案 0 :(得分:1)

在@ gbn的答案的基础上,这将检查以确保长度为11(如果@val不是char(11)或varchar(11)并且还检查以确保倒数第二个char是alpha < / p>

DECLARE @val VARCHAR(20)
SET @val = '12345-678V9'
SELECT  CASE WHEN LEN(@val) = 11 AND @val LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][A-Z0-9][0-9]' 
        THEN 'isMatch'
        ELSE 'isNotMatch'
    END AS [Valid]

答案 1 :(得分:0)

Regular Expressions可以成为你的朋友。

答案 2 :(得分:0)

LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][A-Z][0-9]'

现在,这也允许小写a-z。如果你只想要大写

,你需要强制整理
Value COLLATE Latin_General_BIN
       LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][A-Z][0-9]' COLLATE Latin_General_BIN

答案 3 :(得分:0)

PATINDEX可能是理想的解决方案。

Select ...
From Table
Where PatIndex('[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][A-Z][0-9]', DockNumber) > 0

答案 4 :(得分:0)

Where  DockNumber Like '[0-9][0-9][0-9][0-9][0-9][-][0-9][0-9][0-9][a-z][0-9]

应该可行,但我建议在代码中使用正则表达式。如果可能的话会容易得多。

答案 5 :(得分:0)

正则表达式应为'^\d{5}-\d{3}[A-Z]\d$',因为如果没有^$,它会找到包含该序列的更长字符串(122 12345-678V9 34)。

答案 6 :(得分:0)

你可以使用它,你必须弄清楚如何使用它...

SELECT Case when 
Cast(ISNUMERIC(LEFT(@Str,5)) as int) + case when substring(@str,6,1)= '-' then 1 else 0 end +case when substring(@str,10,1) like '[a-z]' then 1 else 0 end =3
THEN 'Matched'
Else 'NotMatched'
End

答案 7 :(得分:-1)

使用规则

CREATE RULE pattern_rule 
AS
@value LIKE '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][A-Z][0-9]'

然后将规则绑定到列