使用PATINDEX在SQL中解析字符

时间:2014-06-13 13:24:59

标签: sql-server tsql

我正在尝试使用原始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让我感到头疼:(

3 个答案:

答案 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)