在我的存储过程中,我想设置学生ID模式,并进一步根据我想要从表中检索数据的模式。
学生ID模式应该与字符串STUD-
类似,后跟2到3位数字。
该模式应包含STUD-11
和STUD-125
例如:STUD-12
和STUD-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
答案 0 :(得分:2)
您可以为STUD-11
和STUD-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]'
传递最小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的数字结束。