正则表达式返回结果异常,SQL数字验证函数逻辑错误求助
问题2:SQL函数判断纯PESEL始终返回错误提示
先帮你拆解可能的原因,再给你解决方案,毕竟你提到的错误提示明确指向“非数字”或“以0开头”的问题:
常见排查点
- PESEL里藏了非数字字符:比如前后空格、看不见的特殊符号(比如全角空格、制表符),你可能肉眼没发现。可以用这个SQL检查每个字符的ASCII码(数字的ASCII是48-57):
DECLARE @test_pesel VARCHAR(20) = '你的PESEL值' SELECT SUBSTRING(@test_pesel, n, 1) AS 字符, ASCII(SUBSTRING(@test_pesel, n, 1)) AS ASCII码 FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) AS nums(n) WHERE n <= LEN(@test_pesel)
- PESEL以0开头:你的错误提示明确说“由大于0的数字组成”,如果你的PESEL第一个字符是0,函数会直接触发错误。如果这不是你的预期规则,直接删掉判断开头为0的逻辑就行。
- 输入是空值或NULL:如果传入的是
NULL或者空字符串'',函数里的判断逻辑会直接走错误分支,建议先处理NULL情况。 - 数据类型坑:如果你的PESEL字段是
VARCHAR类型,很容易带前后空格,记得先做 trim 处理。
优化后的函数示例(以SQL Server为例)
CREATE FUNCTION CheckPESEL(@pesel VARCHAR(20)) RETURNS VARCHAR(50) AS BEGIN -- 先处理NULL IF @pesel IS NULL RETURN '不正确的PESEL。请输入由大于0的数字组成的PESEL' -- 去除前后空格 SET @pesel = LTRIM(RTRIM(@pesel)) -- 检查空字符串 IF @pesel = '' RETURN '不正确的PESEL。请输入由大于0的数字组成的PESEL' -- 检查是否全为数字 IF @pesel LIKE '%[^0-9]%' RETURN '不正确的PESEL。请输入由大于0的数字组成的PESEL' -- 检查是否以0开头(如果不需要这个规则就删掉这行) IF LEFT(@pesel, 1) = '0' RETURN '不正确的PESEL。请输入由大于0的数字组成的PESEL' -- 所有条件满足 RETURN 'correct' END
测试边界案例
一定要测这几个情况验证函数:
- 正常输入:
SELECT dbo.CheckPESEL('12345678901')→ 应该返回correct - 以0开头:
SELECT dbo.CheckPESEL('01234567890')→ 返回错误提示 - 带空格:
SELECT dbo.CheckPESEL(' 12345678901 ')→ 返回correct(因为做了trim) - 含非数字:
SELECT dbo.CheckPESEL('123a567890')→ 返回错误提示 - NULL输入:
SELECT dbo.CheckPESEL(NULL)→ 返回错误提示
内容的提问来源于stack exchange,提问作者John Wind
相关产品推荐
相关产品推荐

