重写ISNUMERIC函数

本文介绍了一个改进的SQL函数,用于更准确地判断字符串是否为有效的数值格式。通过具体实例对比了内置函数isnumeric与自定义函数的区别,展示了如何创建及使用自定义函数以排除带有特殊字符的非纯数字字符串。

declare @test table(strings varchar(50))

 

Insert into @test

 

Select '12d3' union all

 

Select '87234.45' union all

 

Select '$123,456.00' union all

 

Select '  12  ' union all

 

Select char(10) union all

 

Select '$'

 

 

 

select strings,isnumeric(strings)as valid from @test

 

/*

 

strings                                            valid

 

-------------------------------------------------- -----------

 

12d3                                               1

 

87234.45                                           1

 

$123,456.00                                        1

 

  12                                               1

 

 

 

                                                  1

 

$                                                  1

 

 

 

(6 行受影响)

 

 

 

*/

 

 

 

--重写ISNUMERIC函数

 

 

 

CREATE Function Is_numeric(@value varchar(25))

    Returns bit

as

Begin

    Return(

         case when @value not like '%[^-0-9.]%'

                   and len(@value)-len(replace(@value,'.',''))<2

                   and 1=(case when charindex('-',@value)>0

                                  then

                                    case when left(@value,1)='-'

                                           and len(@value)-len(replace(@value,'-',''))<2

                                           and len(@value)>1

                                         then 1 else 0

                                    end

                               else 1 end)

                 then 1 else 0 end)

 

End

 

GO

 

 

 

select strings,dbo.is_numeric(strings)as valid from @test

 

/*

 

strings                                            valid

 

-------------------------------------------------- -----

 

12d3                                               0

 

87234.45                                           1

 

$123,456.00                                        0

 

  12                                               0

 

 

 

                                                  0

 

$                                                  0

 

 

 

(6 行受影响)

 

 

 

*/

 

 

### 使用 `defaultdict` 自定义键处理方式 在 Python 的 `collections.defaultdict` 中,默认情况下,当访问一个不存在的键时,会调用传入的工厂函数来生成该键对应的默认值。然而,`defaultdict` 并不直接支持为键本身指定处理逻辑或函数。相反,可以通过重写容器行为或者利用其他数据结构间接实现更复杂的键处理。 对于希望针对特定键执行某些操作的需求,通常的做法是在创建 `defaultdict` 实例之前先定义好这些特殊规则,并将其集成到所使用的工厂函数中。下面是一个例子,展示了如何通过继承 `defaultdict` 来扩展其功能并自定义键的行为: ```python from collections import defaultdict class CustomDefaultDict(defaultdict): def __missing__(self, key): # 定义缺失键时的操作 self[key] = value = f"CustomValueFor_{key}" return value custom_dd = CustomDefaultDict() print(custom_dd["not_existed"]) # 输出: CustomValueFor_not_exised ``` 如果想要更加灵活地控制每个键的具体初始化过程,则可以在构建 `defaultdict` 对象时传递一个可调用的对象作为参数,这个对象可以根据输入的键返回相应的初始值: ```python def custom_factory(key): """根据给定的键动态计算默认值""" if isinstance(key, str) and key.isnumeric(): return int(key)**2 else: return [] dd_with_custom_factory = defaultdict(lambda k=key: custom_factory(k)) for i in range(3): dd_with_custom_factory[str(i)] # 这里不会触发lambda内的k赋值语句 print(dd_with_custom_factory) # 结果类似于:defaultdict(<function <lambda> at ...>, {'0': 0, '1': 1, '2': 4}) ``` 需要注意的是,在上述第二个例子中,由于 lambda 表达式的特性,尝试直接捕获外部变量 `k` 是不可行的;因此这里采用了一种变通的方式——让 factory 函数接受一个形参用于接收实际的键名。不过这种做法并不推荐广泛应用于生产环境,因为这可能会引起混淆和难以调试的问题。更好的实践是保持简单明了的设计模式,比如上面提到的第一种方法或是使用常规的类封装机制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值