检索数据_20_按照字符串数字组合的排序
生活随笔
收集整理的這篇文章主要介紹了
检索数据_20_按照字符串数字组合的排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 按照字符串數字組合的排序
需求描述
需求:假設我們從雇員表emp里創建個視圖,這里僅有一個字段,該字段叫data由員工名稱和部門號拼接而成,我們想實現一個查詢可以按照原來的部門編號逆序排序篩選出數據。
解決方法:這里沒有真正創建視圖,因為用戶權限問題,而是建了個表叫做tmp_v。字段拼接生成新字段見上面章節。這里要通過數據庫里的translate和repacle結合來實現這個功能。
注: 數據庫數據集SQL腳本詳見如下鏈接地址
員工表結構和數據初始化SQL腳本
注:SQL Server、Mysql里參照網上實現了translate函數,詳細見下。
SQL代碼
-- Oracle: create table tmp_v as SELECT ename||' '|| deptno as data from empSELECT data,replace(translate(data,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','@@@@@@@@@@@@@@@@@@@@@@@@@@'),'@','') as deptno FROM tmp_v order by replace(translate(data,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','@@@@@@@@@@@@@@@@@@@@@@@@@@'),'@','') desc/* 注: 1 因為我們的ename里的名字都是大寫的,所以這里translate函數里的第二個參數都是大寫的,如果data里是小寫的這里自然是小寫。 2 translate函數有三個參數,第一個一般是字段名或則字符串的值,第二個是要匹配的字符組合,第三個是要裝換成的字符。 3 replace函數一般有三個參數,第一個一般是字段名或則字符串的值,第二個要替換的字段,第三個是要替換成的值。 */執行結果
-- SQL Server:可以在SQL Server里實現個自定義個函數叫translate, 參考至http://blog.sina.com.cn/s/blog_95cfa64601018akj.html具體實現見下: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;ENDcreate view tmp_v AS SELECT ename+' '+ cast(deptno as varchar) as data from empSELECT data,replace(dbo.translate(data,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','@@@@@@@@@@@@@@@@@@@@@@@@@@'),'@','') as deptno FROM tmp_v order by replace(dbo.translate(data,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','@@@@@@@@@@@@@@@@@@@@@@@@@@'),'@','') desc執行結果:
總結
以上是生活随笔為你收集整理的检索数据_20_按照字符串数字组合的排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑醋是什么?
- 下一篇: 龙海市辉兴咸梅糕店电话?