在sql中进行模式匹配,怎么做?

时间:2014-08-21 10:55:19

标签: sql sql-server regex sql-server-2012

到目前为止,我已经查找了有关sql中模式匹配的所有相关信息,但没有任何帮助,我收到短信代码,如" yyyy / mm-digit" (每个消息的数字递增)。所以我想确保用户发送的代码完全采用该格式,否则为另一个动作。怎么样?

这是我的旧代码,只检查数字代码,但它需要它,例如" 2014/08位"有点模式,怎么样? (它随年月而变化)

ALTER TRIGGER [dbo].[T_InsertAfterRcvdMessage]
ON
[dbo].[ReceivedMessages]
AFTER INSERT
AS
   Declare @msg as varchar(20)
   Declare @inmbl as varchar(20)
   Declare @cid as int
   Declare @ComplainantId as int

   BEGIN TRY

           SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted 
             Set @cid = ISNUMERIC(@msg)
              if (@cid = 1)  -- it means @msg is numeric value
                  BEGIN
                    Declare @sts as varchar(50)
                    Declare @mbl as varchar(20)

                     (SELECT @sts = Status, @mbl = ContactNo, @ComplainantId = ComplainantID FROM CPOCMS.dbo.View_ComplaintStatusInfo WHERE ComplaintID = @msg)
                       Exec CmsSMSDb.dbo.ADD_SMS_InQueue @mbl,@sts,0,0,2,1,0,null,@ComplainantId
                  END
              --else
                 -- BEGIN   
                     -- Exec CmsSMSDb.dbo.ADD_SMS_InQueue @inmbl,'Please Provide Valid Complaint No'                        
                 -- END

    END TRY
    BEGIN CATCH
    END CATCH

1 个答案:

答案 0 :(得分:3)

如果您尝试匹配“2014 / 08-”,则可以使用正则表达式或SQL Server内置模式。使用内置模式,您可以查找:

where code like '2014/08-[0-9]%' and
      code not like '2014/08-%[^0-9]%'

也就是说,代码以2014/08-和至少一个数字开头。并且,连字符后没有非数字。

编辑:

在代码的上下文中:

SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted;

IF (@msg like '2014/08-[0-9]%' and
    @msg not like '2014/08-%[^0-9]%'
   ) BEGIN
    . . .
END;

编辑II:

您没有提到2014/08更改,但这很容易处理,排序(SQL Server可能有更简单的字符串和日期函数)。试试这个:

SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted;

DECLARE @yyyymm varchar(255) = (cast(year(getdate()) as varchar(255)) + '/' +
                                right('00' + cast(month(getdate()) as varchar(255)), 2)
                               );

IF (@msg like @yyyymm + '-[0-9]%' and
    @msg not like @yyyymm + '-%[^0-9]%'
   ) BEGIN
    . . .
END;

这使用当前日期进行比较。您可能还有其他日期要使用。