我有一个包含少量列的表,其中一列是DockNumber。如果他们确认特定格式,我必须显示docknumbers
前五个字符是数字,后跟一个 - 后跟5个字符。最后一个字符应该是alpha。
12345-678V9
如果前5个字符是数字并且有连字符,接下来3个是数字,那么如何检查SQL,最后只有一个是alpha。
答案 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]'
然后将规则绑定到列