Как проверить строку в SQL с символами - PullRequest
0 голосов
/ 09 апреля 2020

Проверьте, соответствует ли строка правильному формату или нет. Правильный формат следующий: 0000/00000. Пока это то, что я получил:

declare @ID nvarchar = '0000/00000'


SELECT (case when len(@id) not between 1 and 12 OR @id not like( '[0-9][0-9][0-9][0-9]' + '/' + '[0-9][0-9][0-9][0-9][0-9]')
                                 OR LEFT(@id,13) LIKE '%[0-9]&' then 'OK' else 'ERROR' end

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Во-первых, это будет проблемой:

declare @ID nvarchar = '0000/00000'

Это:

declare @ID nvarchar = '0000/00000';
SELECT @ID LEN(@ID), DATALENGTH(@ID);

Возвращает:

ID   LEN
---- ----
0    1

Имея это в виду, обратите внимание, что это: PATINDEX({your pattern},@Id) вернет естественный логический результат.

DECLARE @ID1     NVARCHAR(1000) = '5555/12312',
        @ID2     NVARCHAR(1000) = '1234/12345678',
        @pattern VARCHAR(100)   = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';

SELECT IsCool = PATINDEX(@pattern,f.Id)
FROM   (VALUES(@ID1),(@ID2)) AS f(Id); 

Возвращает:

IsCool
-----------
1
0

Если под 0000/00000 вы подразумеваете: четыре цифры + "/" + пять цифр, тогда все эти выражения работают ( обратите внимание, я сделал шаблон переменной для более чистого, более легкого для чтения кода, это не требуется):

DECLARE @ID      NVARCHAR(1000) = '5555/12312',
        @pattern VARCHAR(100)   = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';

SELECT CASE PATINDEX(@Pattern,@ID) WHEN 1 THEN 'Ok' ELSE 'Error' END;
SELECT  IIF(PATINDEX(@Pattern,@ID)>0,'Ok','Error');
SELECT  CHOOSE(PATINDEX(@Pattern,@ID)+1,'Error','Ok'); 

Ваш код предполагает, что длина @ID может быть до 12 символов. Допустим, например, допустимые форматы были: 0000/00000 0000/000000 0000/0000000

Тогда вы можете сделать это:

DECLARE @ID      NVARCHAR(1000) = '5555/12312';

SELECT CASE WHEN LEN(@ID)<13 AND SIGN(PATINDEX('%[0-9][0-9]',@ID)) * 
                 PATINDEX('[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]%',@ID) = 1
            THEN 'Ok' ELSE 'Error' END;

Две последние мысли:

  1. LEN({string}) не может быть отрицательное; LEN (@ID) <13 сделает трюк </li>
  2. Если максимальная длина действительно 12, тогда создайте параметр или переменную NVARCHAR (13). Таким образом, например, кто-то передает строку длиной 8000 символов, SQL не нужно сканировать все это, чтобы определить, что оно недопустимо.
0 голосов
/ 09 апреля 2020

Почему бы просто не использовать not like?

where @id not like '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]'

Я предполагаю, что "0" означает, что любой di git разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...