处理字符串_7_判断字符串是字符串数字型
生活随笔
收集整理的這篇文章主要介紹了
处理字符串_7_判断字符串是字符串数字型
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ? ? ? ? ? ? ? ? ? ? ? ?判斷字符串是字符串?dāng)?shù)字型
需求描述
需求:檢索temp_str data表的字段data是字符串?dāng)?shù)字類型的記錄這里如果都是字符串或者數(shù)字的也符合條件.
解決方法:這里通過translate、replace、repeate(replicate、rpad)函數(shù)對含數(shù)字的部分進(jìn)行替換.
注: 數(shù)據(jù)庫數(shù)據(jù)集SQL腳本詳見如下鏈接地址
員工表結(jié)構(gòu)和數(shù)據(jù)初始化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函數(shù)定義詳見如下注釋內(nèi)代碼 /* 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-- 返回將(所有出現(xiàn)的)from_str中的每個(gè)字符替換為to_str中的相應(yīng)字符以后的string。-- TRANSLATE 是 REPLACE 所提供的功能的一個(gè)超集。-- 如果 from_str 比 to_str 長,那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因?yàn)樗鼈儧]有相應(yīng)的替換字符。-- to_str 不能為空。-- Oracle 將空字符串解釋為 NULL,并且如果TRANSLATE 中的任何參數(shù)為NULL,那么結(jié)果也是 NULL。IF @string IS NULL OR @from_str IS NULL OR @to_str IS NULLBEGINRETURN NULL;END;-- 源長度與目標(biāo)長度DECLARE @FromLen INT, @ToLen INT;SET @FromLen = LEN(@from_str);SET @ToLen = LEN(@to_str);-- 準(zhǔn)備用于返回的數(shù)值.DECLARE @resultVal VARCHAR(MAX);SET @resultVal = @string;-- 用于存儲(chǔ) 本次需要替換的字符信息.DECLARE @thisTimeReplace CHAR(1);-- 從后向前依次替換.WHILE @FromLen > 0BEGIN-- 取得本次即將要替換的字符.SET @thisTimeReplace = SUBSTRING(@from_str, @FromLen, 1);IF CHARINDEX(@thisTimeReplace, @from_str) < @FromLenBEGIN-- 假如當(dāng)前這個(gè)要替換的字符,在前面還有,那么這里就不替換了-- 原因,為了支持-- SELECT TRANSLATE('2KRW229', '1234567890' || '2KRW229', '1234567890')-- 這樣的效果.-- 向前處理上一個(gè)/*補(bǔ)充說明:1 理論上TRANSLATE函數(shù)的@from_str參數(shù)和@to_str參數(shù)的長度要一致,即一一映射。比如@from_str='0123',@to_str='abcd'2 該步驟旨在找到在@from_str參數(shù)里要替換的的字符重復(fù)指定了,比如'0123XYZ23',這里23是重復(fù)指定了,對于重復(fù)指定的要舍棄所以需要在該步時(shí)需要將@FromLen鎖定到字符Z的位置即7*/SET @FromLen = @FromLen - 1;CONTINUE;ENDIF @FromLen > @ToLenBEGIN-- from_str 比 to_str 長,那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因?yàn)樗鼈儧]有相應(yīng)的替換字符。SET @resultVal = REPLACE(@resultVal, SUBSTRING(@from_str, @FromLen, 1), '');ENDELSEBEGIN-- from_str中的每個(gè)字符替換為to_str中的相應(yīng)字符以后的string-- SELECT dbo.TRANSLATE('2KRW229', '12345678902KRS229','12345678902') 這里用S替換時(shí)其實(shí)無效SET @resultVal = REPLACE(@resultVal, @thisTimeReplace, SUBSTRING(@to_str, @FromLen, 1));END;-- 處理完當(dāng)前字符后,向前處理上一個(gè).SET @FromLen = @FromLen - 1;END;-- 依次處理完畢后,返回結(jié)果.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))-- 或者用如下方法,思路通過判斷截取的每個(gè)字符的ASCII值來判斷區(qū)間是否落在[48,57],[97,122],落在的為0,反之為1,然后再通過對該Flag進(jìn)行sum來判斷,如果等于0則說明數(shù)字字符型的.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))-- 利用正則表達(dá)式來匹配 SELECT data FROM temp_str WHERE data regexp '[^0-9A-Za-z]' = 0-- 待驗(yàn)證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執(zhí)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的处理字符串_7_判断字符串是字符串数字型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么更改硬盘格式呢 修改硬盘格式方法
- 下一篇: 镜像文件怎么用 u盘大白菜 如何用 U