在sql存储过程中出现零次或多次模式匹配

时间:2015-06-23 19:44:05

标签: sql sql-server regex stored-procedures

在我的存储过程中,我想设置学生ID模式,并进一步根据我想要从表中检索数据的模式。

学生ID模式应该与字符串STUD-类似,后跟2到3位数字。

该模式应包含STUD-11STUD-125

的值

例如:STUD-12STUD-123

目前我正在使用模式:

SET @stud_ID_like = 'STUD-[1-9][0123456789]'

但它接受我不想要的STUD-10

如何在字符串STUD-之后获得3位数字。

对于此,如果我使用STUD-[1-9][0123456789][0123456789]模式,那么我如何获取像STUD-15这样的2位数值。

在SQL中是否存在用于模式匹配的'*'外卡字符,以便我可以将其用于零次或多次出现?或者其他任何解决方案?

我的存储过程是这样的:

stored procedure A
    @stud_ID_like varchar(128)
AS
BEGIN
    SET @stud_ID_like = 'STUD-[1-9][0123456789]'

    BEGIN TRANSACTION
        SELECT TOP 1 [Student Name]
        FROM [Student_list_table] 
        WHERE [Result] = 'PASS' AND [St_ID] LIKE @stud_ID_like 

    COMMIT TRANSACTION
END

3 个答案:

答案 0 :(得分:2)

您可以为STUD-11STUD-125

之间的匹配构建或声明
SELECT TOP 1 [Student Name]
FROM [Student_list_table] 
WHERE [Result] = 'PASS' 
AND [St_ID] LIKE 'STUD-1[1-9]' 
    OR [St_ID] LIKE 'STUD-[2-9][0-9]'
    OR [St_ID] LIKE 'STUD-1[0-1][0-9]'
    OR [St_ID] LIKE 'STUD-12[0-5]'

SQL Fiddle Example

传递最小ID和最大ID可能会少一些麻烦,然后将STUD-之后的值转换为int并进行比较。

CREATE PROC A (
    @Min INT,
    @Max INT
)
AS
BEGIN
    SET @Min = 11
    SET @Max = 125

    SELECT TOP 1 [Student Name]
    FROM [Student_list_table] 
    WHERE [Result] = 'PASS' 
        AND CONVERT(INT, SUBSTRING([St_ID], PATINDEX('%-%', [St_ID]) + 1, LEN([St_ID]))) 
            BETWEEN @Min AND @Max
END

答案 1 :(得分:1)

如果StudentID列上存在索引,此解决方案将不使用索引:

where replace(StudentID, 'STUD-', '') between 11 and 125

答案 2 :(得分:1)

为了达到规定的标准,您必须做3个部分。

来自OP评论..

  

除了STUD-1到STUD-10,从STUD-11到STUD-125的所有其他值都是   我的有效价值。主要的是我如何检查零或更多   出现以便我可以将它用于第三位

readerForUpdating

这将涵盖11 - 999

如果你想强行排除值> = 126,你可以继续这样的嵌套条件,但它会变得难看。其他提议的答案之一就是对它进行了尝试,但是意外地排除了超过100的所有值,这些值以高于5的数字结束。