sql - 如何使用字符验证 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
解决方案
首先,这将是一个问题:
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;
最后的两个想法:
LEN({string})
不能为负;LEN(@ID) < 13 可以解决问题- 如果最大长度确实为 12,则将参数或变量设为 NVARCHAR(13)。这样,例如,有人传入一个 8000 个字符的字符串,SQL 不必扫描整个内容来确定它是无效的。
推荐阅读
- ios - 没有服务器代码的 Firebase 云消息推送通知
- json - 如何从 Http 响应中获取 JSON 对象?
- selenium - 如何在TestNG中使用相同的参数传递多个值
- android - 有什么简单的方法可以让 FirebaseRecyclerAdapter 实现 'com.firebaseui:firebase-ui-database:4.0.1'
- node.js - 为什么这是“未定义”
- c# - Cookie 和 C# HttpWebRequest
- amazon-web-services - Cloudwatch 不记录来自 Cloudfront 的 Lambda 函数吗?
- twitter-bootstrap-3 - 停止引导警报自动关闭
- c# - JSON.NET 将子属性添加到属性
- android - React native 无法使用 android 模拟器连接到 react-devtools