Forcing the binary collation (i.e. the COLLATE Latin1_General_100_BIN2
after each @Runner
reference) ensures that we are only dealing with these 10 decimal digits and not any other character that might be considered equivalent
To put the above logic into a Scalar UDFan Inline Table-Valued Function (TVF) so that it is easier to use (and more efficient than a similarly easy-to-use scalar UDF), try the following:
USE [tempdb];
GO
CREATE FUNCTION dbo.IsRunnerPresent
(
@Runner VARCHAR(10),
@Runners VARCHAR(8000)
)
RETURNS BITTABLE
WITH SCHEMABINDING
AS RETURN
BEGIN
DECLARE @FoundSELECT BIT;CONVERT(BIT,
SET @Found CASE WHEN @Runner COLLATE Latin1_General_100_BIN2 = 0;
@Runners
IF ( OR PATINDEX('%[^0123456789]' + @Runner
COLLATE Latin1_General_100_BIN2,
COLLATE Latin1_General_100_BIN2, @Runners) > 0
OR PATINDEX(@Runner + '[^0123456789]%'
COLLATE Latin1_General_100_BIN2,
COLLATE Latin1_General_100_BIN2, @Runners) > 0
OR PATINDEX('%[^0123456789]' + @Runner + '[^0123456789]%'
COLLATE Latin1_General_100_BIN2, @Runners) > 0
)
BEGIN THEN 1
SET @Found = 1;
END;
ELSE 0
RETURN @Found;
END; END) AS [RunnerFound];
GO
DECLARE @Runner VARCHAR(10);
SET @Runner = '6';
DECLARE @Data TABLE
(
[ID] INT NOT NULL PRIMARY KEY,
[Runners] VARCHAR(50) NULL
);
INSERT INTO @Data ([ID], [Runners]) VALUES (1, '16+7+9+6');
INSERT INTO @Data ([ID], [Runners]) VALUES (2, '16+7+9+5');
INSERT INTO @Data ([ID], [Runners]) VALUES (3, '26+77+9+5');
INSERT INTO @Data ([ID], [Runners]) VALUES (4, '6+3+45');
INSERT INTO @Data ([ID], [Runners]) VALUES (5, '63,808,111,92');
INSERT INTO @Data ([ID], [Runners]) VALUES (6, '1-7-9,6');
INSERT INTO @Data ([ID], [Runners]) VALUES (7, '1-6-9,7');
INSERT INTO @Data ([ID], [Runners]) VALUES (8, '1-7-9,63');
INSERT INTO @Data ([ID], [Runners]) VALUES (9, '1-63-9,7');
INSERT INTO @Data ([ID], [Runners]) VALUES (10, NULL);
INSERT INTO @Data ([ID], [Runners]) VALUES (11, '6');
SELECT tmp.[ID],
tmp.[Runners],
fnd.[RunnerFound]
FROM @Data tmp
CROSS APPLY dbo.IsRunnerPresentIsRunnerPresentTVF(@Runner, tmp.[Runners]) AS [RunnerFound]
FROM @Data tmp;fnd;
Which returns:
ID Runners RunnerFound
1 16+7+9+6 1
2 16+7+9+5 0
3 26+77+9+5 0
4 6+3+45 1
5 63,808,111,92 0
6 1-7-9,6 1
7 1-6-9,7 1
8 1-7-9,63 0
9 1-63-9,7 0
10 NULL 0
11 6 1