将字符串与sql中的正则表达式进行比较

时间:2014-09-04 09:17:21

标签: sql sql-server sql-server-2008 tsql

我收到短信代码,如" yyyy / mm-digit" (每个消息的数字递增)。所以我想确保用户发送的代码完全采用该格式,否则为另一个动作。怎么样?

这是我要检查的代码,但它总是执行else块,为什么?注意:我想要它,例如"八分之二千○十四位数"有点模式,怎么样? (它随年月而变化)

这是我的一点点努力,但它投掷dateitme转换失败错误加上它可能还有其他问题,帮助

Alter PROCEDURE TestTrigger



AS
BEGIN
     Begin Try
           Declare @msg as varchar(20)
           SELECT @msg = '2014/9-1'

           DECLARE @yyyymm varchar(255) = Convert(Varchar ,(cast(year(@msg) as varchar(255)) + '/' +
                                right(cast(month(@msg) as varchar(255)), 2)
                               ));

                IF (@msg like @yyyymm + '-[0-9]%' and
                    @msg not like @yyyymm + '-%[^0-9]%'
                   )
                  BEGIN
                    Print 'Done'
                  END
                  ELSE
                  BEGIN
                    Print 'Not Done'
                  END
    END TRY
    BEGIN CATCH
     Select ERROR_MESSAGE() as ErrorMsg
    END CATCH

END
GO

1 个答案:

答案 0 :(得分:0)

原因是YEARMONTH函数都期望datetime参数,而'2014/9-1'不是有效的日期时间。

由于您只有两种可能的格式yyyy/mm-digit适用于10-12个月而yyyy/m-digit适用于第1-9个月(假设这一年将是过去1000年),您可以使用此比较:

@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%'

如果您需要检查该数字是否为有效数字,您可以使用SUBSTRING和CHARINDEX提取数字,然后检查是否出现任何非数字字符:

NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%' 

e.g。

SELECT  msg,
        ValidDate = CASE WHEN msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
                                OR msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%' 
                        THEN 1 
                        ELSE 0 
                    END,
        ValidDigit = CASE WHEN SUBSTRING(msg, CHARINDEX('-', msg) + 1, LEN(msg)) LIKE '%[^0-9]%' 
                            THEN 0 
                            ELSE 1 
                        END
FROM (VALUES ('2014/9-1'), ('201/9-2'), ('2014/13-3'), ('2014/9-A'), ('2014/0-15x')) t (msg);

所以我认为你的代码会是这样的:

DECLARE @msg VARCHAR(20) = '2014/9-1';

IF ((@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
    OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%')
    AND NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%')
    BEGIN
        PRINT 'Done';
    END
ELSE
    BEGIN
        PRINT 'Not Done';
    END