我正在尝试使用原始sql验证字符串; 尝试使用:
DECLARE @AlphaNumeric varchar(50)
SET @AlphaNumeric = '1017a'
SELECT SUBSTRING(@AlphaNumeric, 1, (PATINDEX('%[^0-9]%', @AlphaNumeric) - 1)) AS 'Numeric',
SUBSTRING(@AlphaNumeric, PATINDEX('%[^0-9]%', @AlphaNumeric), DATALENGTH(@AlphaNumeric)) AS 'Alpha'
但是如果用户键入101a7a,这不能正常工作;我想要做的就是; 我希望变量始终是,数字+字母数字,长度无关紧要。 例如:
2303A OK
23A434A NOT OK
A344 NOT OK.
4324AAC确定
如果我能在Regex中做到这一点会很容易,但是sql让我感到头疼:(
答案 0 :(得分:1)
字母后跟数字都可以;数字后跟字母不是;所有字符必须是字母或数字。因此...
select * from yourtable
where yourfield like '%[0-9][a-z]%'
and not (yourfield like '%[a-z][0-9]%')
and not (yourfield like '%[^0-9a-z]%')
答案 1 :(得分:0)
我认为这会做你想要的。至少,它适用于您的样本数据:
with t as (
select '2303A' as col union all
select '23A434A' union all
select 'A344'
)
select *,
(case when col like '%[0-9]%' and
substring(col, patindex('%[A-Z]%', col), len(col)) not like '%[^A-Z]%'
then 'OK'
else 'NOT OK'
end)
from t;
这两个条件是。首先检查字符串是否有某个数字。然后,检查找到第一个字母后是否只有字母。我假设所有字母都是大写的。
编辑:
可能有一种更简单的方法。你可以检查一个数字后跟字母表中的某个字母,但是一个字母后面跟一个数字。为此,您只需要:
select (case when col not like '%[^A-Z0-9]%' and
col like '%[0-9][A-Z]%' and
col not like '%[A-Z][0-9]%'
then 'OK'
else 'NOT OK'
end)
答案 2 :(得分:0)
我的方法应该适用于您的情况。基本上标识最后一个整数的位置,并将其与第一个非整数的位置进行比较。您可以像这样获取最后一个整数的位置
len(@AlphaNumeric) - PATINDEX('%[0-9]%', Reverse(@AlphaNumeric))+1
你可以像这样得到第一个非整数的位置
PATINDEX('%[^0-9]%', @AlphaNumeric)
这样就可以生成你的where子句(其中所有整数都在任何非整数之前,如
)Where (len(@AlphaNumeric) - PATINDEX('%[0-9]%', Reverse(@AlphaNumeric))+1 ) < PATINDEX('%[^0-9]%', @AlphaNumeric)