判断字符串是字符串数字型

需求描述

需求:检索temp_str data表的字段data是字符串数字类型的记录这里如果都是字符串或者数字的也符合条件.

解决方法:这里通过translate、replace、repeate(replicate、rpad)函数对含数字的部分进行替换.

注: 数据库数据集SQL脚本详见如下链接地址

员工表结构和数据初始化SQL脚本

SQL代码

--Sql Server:
CREATE TABLE temp_str(data VARCHAR(1000));INSERT INTO temp_str VALUES('SMITH20');
INSERT INTO temp_str VALUES('JONES30');
INSERT INTO temp_str VALUES('Jim#40');
INSERT INTO temp_str VALUES('50$Tom');
INSERT INTO temp_str VALUES('60:Mike');
INSERT INTO temp_str VALUES('70Cruz');
INSERT INTO temp_str VALUES('Jack');
INSERT INTO temp_str VALUES('J8oh0n');-- Sql Server版translate函数定义详见如下注释内代码
/*
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[translate](@string VARCHAR(MAX),@from_str VARCHAR(MAX),@to_str VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN-- 返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。-- TRANSLATE 是 REPLACE 所提供的功能的一个超集。-- 如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。-- to_str 不能为空。-- Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。IF @string IS NULL OR @from_str IS NULL OR @to_str IS NULLBEGINRETURN NULL;END;-- 源长度与目标长度DECLARE @FromLen INT, @ToLen INT;SET @FromLen = LEN(@from_str);SET @ToLen = LEN(@to_str);-- 准备用于返回的数值.DECLARE @resultVal VARCHAR(MAX);SET @resultVal = @string;-- 用于存储 本次需要替换的字符信息.DECLARE @thisTimeReplace CHAR(1);-- 从后向前依次替换.WHILE @FromLen > 0BEGIN-- 取得本次即将要替换的字符.SET @thisTimeReplace = SUBSTRING(@from_str, @FromLen, 1);IF CHARINDEX(@thisTimeReplace, @from_str) < @FromLenBEGIN-- 假如当前这个要替换的字符,在前面还有,那么这里就不替换了-- 原因,为了支持-- SELECT TRANSLATE('2KRW229', '1234567890' || '2KRW229',  '1234567890')-- 这样的效果.-- 向前处理上一个/*补充说明:1 理论上TRANSLATE函数的@from_str参数和@to_str参数的长度要一致,即一一映射。比如@from_str='0123',@to_str='abcd'2 该步骤旨在找到在@from_str参数里要替换的的字符重复指定了,比如'0123XYZ23',这里23是重复指定了,对于重复指定的要舍弃所以需要在该步时需要将@FromLen锁定到字符Z的位置即7*/SET @FromLen = @FromLen - 1;CONTINUE;ENDIF @FromLen > @ToLenBEGIN-- from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。SET @resultVal = REPLACE(@resultVal, SUBSTRING(@from_str, @FromLen, 1), '');ENDELSEBEGIN-- from_str中的每个字符替换为to_str中的相应字符以后的string-- SELECT dbo.TRANSLATE('2KRW229', '12345678902KRS229','12345678902') 这里用S替换时其实无效SET @resultVal = REPLACE(@resultVal, @thisTimeReplace, SUBSTRING(@to_str, @FromLen, 1));END;-- 处理完当前字符后,向前处理上一个.SET @FromLen = @FromLen - 1;END;-- 依次处理完毕后,返回结果.RETURN @resultVal;END*/SELECT data --,dbo.translate(UPPER(data),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',REPLICATE('a',36)) as trans
FROM temp_str
WHERE dbo.translate(UPPER(data),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',REPLICATE('a',36))=REPLICATE('a',LEN(data))-- 或者用如下方法,思路通过判断截取的每个字符的ASCII值来判断区间是否落在[48,57],[97,122],落在的为0,反之为1,然后再通过对该Flag进行sum来判断,如果等于0则说明数字字符型的.SELECT data -- ,SUM(Flag)
FROM
(
SELECT LOWER(data) as data,SUBSTRING(e.data,seq.pos,1) AS ename_Split,ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) AS asci,
CASE WHEN ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) >= 48 AND ascii(SUBSTRING(LOWER(e.data),seq.pos,1))<=57 THEN 0
WHEN ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) >= 97 AND ascii(SUBSTRING(LOWER(e.data),seq.pos,1))<=122 THEN 0 ELSE 1 END AS Flag
FROM temp_str e,
(SELECT number AS pos FROM master.[dbo].[spt_values] WHERE type = 'P' AND number>0) seq
WHERE seq.pos<=LEN(e.data)
-- ORDER BY data
)A
GROUP BY data
HAVING SUM(Flag) = 0--Mysql:
SELECT data -- ,translate(UPPER(data),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',REPEAT('a',36)) AS trans
FROM temp_str
WHERE  translate(UPPER(data),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',REPEAT('a',36))=REPEAT('a',LENGTH(data))-- 利用正则表达式来匹配
SELECT data
FROM temp_str
WHERE data regexp '[^0-9A-Za-z]' = 0-- 待验证Mysql8
WITH RECURSIVE cte (num) AS
(SELECT 1UNION ALLSELECT num + 1 FROM cte WHERE num < 100
)
SELECT data -- ,SUM(Flag)
FROM
(
SELECT LOWER(data) as data,SUBSTRING(e.data,seq.pos,1) AS ename_Split,ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) AS asci,
CASE WHEN ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) >= 48 AND ascii(SUBSTRING(LOWER(e.data),seq.pos,1))<=57 THEN 0
WHEN ascii(SUBSTRING(LOWER(e.data),seq.pos,1)) >= 97 AND ascii(SUBSTRING(LOWER(e.data),seq.pos,1))<=122 THEN 0 ELSE 1 END AS Flag
FROM temp_str e,
(SELECT num FROM cte) seq
WHERE seq.pos<=LEN(e.data)
-- ORDER BY data
)A
GROUP BY data
HAVING SUM(Flag) = 0

执行结果

处理字符串_7_判断字符串是字符串数字型相关推荐

  1. c语言字符串中取最大字符串,使用C语言提取子字符串及判断对称子字符串最大长度...

    先来看一个使用C语言从字符串中提取子字符串的基本方法总结: #include /*处理中文字符*/ /*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,获取字符串长度*/ int S ...

  2. pandas怎么去除nan_pandas缺失值处理之——如何消去Nan值对数字型字符串数据类型的影响,让数字型字符串保持原始str类型,而不会自动变为float类型?...

    在利用pandas处理表格时,往往有时我们用表格做的测试用例往往会设计考一些必填项*故意赋值为空(代表不输入)的测试用例, 比如说我们的手机号.身份证号码.社会统一信用代码等都是数字型字符串.如下所示 ...

  3. 字符串问题----判断两个字符串是否互为旋转词

    判断两个字符串是否互为旋转词 如果一个字符串str,把字符串str前面的任意部分挪到后面形成的字符串叫做str的旋转词.给定两个字符串,判断是否互为旋转词.比如 a="abcd", ...

  4. 字符串处理问题[2]:将一个数字型…

    1.C语言有atoi.atol.atof等库函数,可分别把ASCII编码的字符串转化为int.long.float类型的数字. 头文件:stdlib.h 函数原型:int atoi(const cha ...

  5. python 字符串 数组 判断,Python的字符串的数组指数

    Is it possible to use strings as indices in an array in python? For example: myArray = [] myArray[&q ...

  6. php字符型和数字型的注入,Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  7. SOL注入——基于联合查询的数字型GET注入(二)

    本章目的 普及数字型GET注入的原理和特点,掌握利用联合查询(unionselect)的方法实现SQL注入的基本流程. 实验环境 攻击机:Pentest-Atk (1)操作系统:Windows10 ( ...

  8. shell 脚本比较字符串相等_shell字符串比较判断是否为数字

    shell字符串比较判断是否为数字 更新时间:2013年01月23日 17:39:14   作者: 本文阐述:shell中整数比较方法及字符串的比较方法,如等于,不等于,大于,大于等于,小于,等等 二 ...

  9. swift 判断输入的字符串是否为数字

    // 判断输入的字符串是否为数字,不含其它字符 func isPurnInt(string: String) -> Bool { let scan: Scanner = Scanner(stri ...

最新文章

  1. mybits注解详解
  2. 简单的Gradle Web应用程序
  3. 题库明细 C#语言和SQL Server
  4. MATLAB学习笔记(九)
  5. 数据库练习题总题库选择判断简答操作题
  6. java threadlocal 并发_Java并发编程:ThreadLocal
  7. js中window的属性
  8. 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
  9. ActivityGroup的简单用法
  10. php 图片轮换 代码,jQuery实现图片轮播特效代码分享
  11. 3D游戏建模快速制作枪械的几种方法【3Dmax,Zbrush,Maya】
  12. Vue + Spring Boot 项目实战(十三):使用 Shiro 实现用户信息加密与登录认证
  13. veu项目实践详细笔记(一)
  14. 【渝粤教育】国家开放大学2018年秋季 0062-21T港台文学专题讲座 参考试题
  15. conda 配置R虚拟环境并安装 monocle 包
  16. 基于VS2017的C++ SuperLU混合编程
  17. UKey税务系统开票及打票流程
  18. Abbkine 彩色预染蛋白质Marker (10-180 kDa)方案
  19. C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_概述
  20. 向量运算 与 JavaScript

热门文章

  1. VTK:actors的类型用法实战
  2. JavaScript实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)
  3. OpenCASCADE:拓扑 API之历史支持
  4. boost::iota相关的测试程序
  5. boost::math::quadrature::tanh_sinh用法的测试程序
  6. ITK:向转换工厂注册非默认转换
  7. DCMTK:OFCharacterEncoding的测试程序
  8. VTK:Points之ExtractSurfaceDemo
  9. VTK:网格之TableBasedClipDataSetWithPolyData2
  10. VTK:网格之ClipDataSetWithPolyData