SqlServer 判断字符是否汉字或数字方法

本文介绍 SQL Server 中如何判断字段值为数字还是汉字,并提供了一种不准确但有趣的判断汉字数量的方法。

sqlserver 中判断是否数字,是否汉字的方法

SELECT *
FROM Flydove_Class_2
WHERE (PATINDEX('%[吖-做]%', Typename) == 0) //判断汉字

SELECT *
FROM Flydove_Class_2
WHERE (ISNUMERIC(Typename) == 0) //判断数字

 

判断字符窗中汉字个数方法(不靠谱)

declare @sql varchar(1000)
set @sql='abc国m,de中d国e人民f'
select @sql 字符,DATALENGTH(@sql)-len(@sql) 汉字个数

 

<think>好的,用户想在SQL Server中提取字符串中的数字,直到遇到特定字符时停止。我需要结合提供的引用内容,找到合适的方法。 首先,引用[1]中的函数使用循环逐个移除非数字字符,最终返回纯数字。但这种方法会提取所有数字,无法在遇到特定字符时停止。比如,如果字符串是"abc123#456",用户可能只需要在遇到#之前的123,而引用1的方法会返回123456。 接下来,引用[2]和[3]展示了如何提取中文字符,通过检查每个字符的Unicode范围。这给了我一个思路:可以遍历每个字符判断是否数字,直到遇到指定字符为止。 因此,我需要修改现有的函数,添加一个停止条件。具体步骤可能包括: 1. 遍历字符串中的每个字符。 2. 检查当前字符是否数字,如果是,添加到结果中。 3. 如果遇到指定字符,停止处理。 4. 返回已收集的数字部分。 需要注意的是,用户可能希望指定多个停止字符,比如遇到#$时停止。所以函数需要接受停止字符作为参数。 例如,字符串"12a34@56",指定停止符为'@',应该提取"12a34"中的数字部分,即"1234",但根据用户需求,可能需要在遇到第一个非数字字符时停止。这里可能需要明确用户的需求:是提取连续的数字直到遇到停止符,还是提取所有数字直到停止符出现,不管中间是否有其他字符。 根据用户的问题描述,应该是提取数字直到遇到指定字符,不管中间是否有其他非数字字符,比如在"abc123#456"中,遇到#时停止,提取前面的数字123。但原字符串中的abc是非数字,可能需要先提取连续的数字者在遇到停止符之前的所有数字? 可能需要澄清,但根据问题描述,用户可能希望提取从头开始的数字,直到遇到停止符,而不管中间是否有其他字符者,可能希望提取所有数字,直到遇到停止符,但跳过中间的非数字字符,直到停止符出现。 假设用户需要的是:从字符串中提取数字,当遇到指定停止字符时停止,即使中间有其他非数字字符,例如,字符串"12a34@56",停止符是@,那么需要提取12,因为a是非数字,停止在a处?者继续提取直到@,提取所有数字部分,即1234? 这里可能需要进一步分析。例如,用户可能需要两种不同的处理方式: 1. 提取连续的数字,直到遇到停止符。 2. 提取所有数字,直到遇到停止符,不管是否连续。 根据用户的问题描述,“直到遇到特定字符停止”,可能意味着在遍历字符串时,一旦遇到特定字符就停止处理,无论是否数字中间。例如,"12a34@56",停止符是@,那么处理到@时停止,那么可能需要提取前面的所有数字,包括在遇到@之前的数字,即提取12(因为a是非数字,之后34是数字,但停止符是@,所以需要判断何时停止)。 者,用户可能希望提取连续的数字,直到遇到停止符。例如,在字符串"123abc456@789"中,停止符是@,那么可能希望提取123,因为遇到非数字字符a时停止,但这里停止符是@,所以可能需要继续到@的位置,提取所有数字直到@,即123456。 但用户的问题可能更倾向于,在字符串中逐个字符检查,如果是数字则收集,直到遇到指定的停止字符,不管中间是否有其他非数字字符。比如,在"12a34@56"中,停止符是@,那么处理每个字符,直到遇到@为止,收集其中的数字,即1,2,然后a是非数字,跳过,3,4,然后遇到@停止,结果应该是1234。 所以,需要创建一个函数,遍历每个字符,当字符数字时添加到结果,当遇到停止符时终止循环。 参考引用中的函数结构,可以修改循环,添加一个条件判断:如果当前字符是停止符,则跳出循环。同时,在遍历时,检查每个字符是否数字,如果是则保留,否则跳过,但一旦遇到停止符就停止。 例如,修改引用[1]的函数,将循环条件改为遍历每个字符,检查是否是停止符,如果是则停止,否则如果是数字则保留。 具体步骤: 1. 创建一个函数,接受字符串和停止符作为参数。 2. 初始化结果变量。 3. 遍历字符串的每个字符: a. 如果当前字符是停止符,终止循环。 b. 否则,如果是数字,添加到结果。 4. 返回结果。 但SQL Server中处理字符串需要逐个字符处理,可能使用循环递归。 例如,使用循环,逐个检查字符: CREATE FUNCTION dbo.GET_NUMBER_UNTIL_STOP (@S VARCHAR(100), @StopChar CHAR(1)) RETURNS VARCHAR(100) AS BEGIN DECLARE @Result VARCHAR(100) = ''; DECLARE @i INT = 1; WHILE @i <= LEN(@S) BEGIN DECLARE @Char CHAR(1) = SUBSTRING(@S, @i, 1); IF @Char = @StopChar BREAK; IF @Char BETWEEN '0' AND '9' SET @Result += @Char; SET @i += 1; END RETURN @Result; END 这个函数会遍历字符串中的每个字符,直到遇到@StopChar为止,收集所有数字字符。 测试案例: 输入'abc123#456',停止符'#',返回'123'; 输入'12a34@56',停止符'@',返回'1234'; 输入'turing我666QQ中国AK123',停止符'Q',返回'666'。 但用户可能需要停止符是多个字符中的一个?比如遇到任何指定的字符就停止。这时可能需要将@StopChar改为一个集合,比如使用LIKE模式匹配。 但根据用户的问题,可能只需单个停止字符。如果需要多个,可以修改条件为CHARINDEX(@Char, @StopChars) > 0。 综上,给出一个函数示例,并说明用法,然后生成相关问题。</think>### 分步解决方案 在SQL Server中提取字符串中的数字直到遇到指定字符,可以通过以下步骤实现: 1. **创建自定义函数** 使用`WHILE`循环逐个字符遍历字符串,满足以下条件时终止: - 遇到指定停止字符 - 字符串遍历完成 ```sql CREATE FUNCTION dbo.GET_NUMBER_UNTIL_STOP (@S VARCHAR(100), @StopChar CHAR(1)) RETURNS VARCHAR(100) AS BEGIN DECLARE @Result VARCHAR(100) = ''; DECLARE @i INT = 1; WHILE @i <= LEN(@S) BEGIN DECLARE @Char CHAR(1) = SUBSTRING(@S, @i, 1); IF @Char = @StopChar BREAK; IF @Char BETWEEN '0' AND '9' SET @Result += @Char; SET @i += 1; END RETURN @Result; END ``` 2. **调用函数** 输入字符串和停止字符参数: ```sql SELECT dbo.GET_NUMBER_UNTIL_STOP('turing我666QQ中国AK123', 'Q') -- 输出结果:666 ``` ### 功能说明 - **遍历逻辑**:逐个字符检查,若为数字则保留,遇到停止字符立即终止[^1] - **兼容性**:支持中英文混合字符串,仅提取ASCII数字字符 - **扩展性**:可修改`@StopChar`参数为多个停止符(需调整判断逻辑)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值