首页 > 解决方案 > 如何使用字符验证 SQL 中的字符串

问题描述

检查字符串是否遵循正确的格式。正确的格式如下: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

标签: sqlstringtsql

解决方案


首先,这将是一个问题:

declare @ID nvarchar = '0000/00000'

这个:

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

回报:

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

考虑到这一点,请注意 this: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 可以解决问题
  2. 如果最大长度确实为 12,则将参数或变量设为 NVARCHAR(13)。这样,例如,有人传入一个 8000 个字符的字符串,SQL 不必扫描整个内容来确定它是无效的。

推荐阅读