如何使用字符验证SQL中的字符串



检查字符串的格式是否正确。正确的格式如下:0000/000000。到目前为止,这就是我所得到的:

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

为什么不直接使用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"表示允许使用任何数字。

首先,这将是一个问题:

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
00000/00000

然后你可以这样做:

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就能搞定
  2. 如果最大长度真的是12,那么使参数或变量NVARCHAR(13(。例如,通过这种方式,有人传入一个8000个字符的字符串,SQL不必扫描整个字符串来确定它是无效的

相关内容

  • 没有找到相关文章

最新更新