SQL cookbook學習筆記(六) 使用字串

2021-09-02 15:24:08 字數 4989 閱讀 7019

length :表示字串長度 

replace:單體替換

replace(str1,str2,str3) 

說明:str3替換str1中出現的所有str2,返回新的字串,如果有某個引數為null,此函式返回null 

該函式可以多次替換,只要str1中還有str2存在,最後都被替換成str3 

若str3為空,則刪除str2

translate:批量替換

translate ( 輸入字串, 要替換的字元, 替換成的字元) 

repeat:

repeat(str,srchstr,rplcstr)返回字串str重複x次的結果

substr:

substr(str,pos,len): 從pos開始的位置,擷取len個字元

substr(str,pos): pos開始的位置,一直擷取到最後

遍歷字串

解決方案:使用笛卡爾積來生成行號,用來在該返回字串中的每個字元。然後,使用dbms中的內建的字串分析函式來摘出所要顯示的字元(sql server使用者可使用substring代替substr)

字串文字中包含引號

使用引號(『』)時,可以將它們當做括號()看待,引號必須成對

計算字元在字串中出現的次數

解決思路:先計算出原字串的長度,然後計算去掉逗號後字串的長度,差就是逗號在該字串中出現的次數。每種dbms都提供了求字串的長度以及刪除某個字元的函式。多數為(length和replace(sql server是len函式,而不是length))

最後一步的操作是將計算出的差值除以要查詢的字串長度。如果所要查詢的字串的長度大於1時,這一步不能少。

select (length(『字串』)-length(replace(『字串』),『目標字元』,『 』))/length(『目標字元』)

從字串中刪除不需要的字元

解決思路:每種dbms都提供了用來從字串中刪除不需要的字元,常用的是replace和translate

db2

使用內建idtranslate和replace

mysql和sql server

不支援translate,只能多次呼叫replace

oracle和postgresql

使用內建idtranslate和replace

將字串和數字資料分離

解決思路:使用內建函式translate和replace,將多個字元轉換為單個字元。用乙個字元來代替所有的數字或者乙個字元代表所有字元。但是首先需要用translate將所有的字元資料隔開!

db2

使用內建idtranslate和replace

oracle

使用內建idtranslate和replace

postgresql

使用內建idtranslate和replace

判別字串是不是字母數字型

解決思路:查出所有的字母與數字字元。將所有的字母與數字用所選定的字元替代後,就可以輕鬆的將字母數字與其他字元分開。

db2

使用translate將所有字母與數字轉為同乙個字元,然後判斷哪些行中還有沒被轉換的字元。

mysql

使用正則

oracle和postgresql

使用translate將所有字母與數字轉為同乙個字元,然後判斷哪些行中還有沒被轉換的字元。

sql server

不支援translate,因此必須判斷每一行中只包含非數字字母。

提取姓名的大寫首字母縮寫(假定名字都是由名和姓,或者由名,中間名(中間名縮寫),及姓組成)

db2

使用內建函式replace,translate和repeat來提取大寫首字母縮寫

mysql

使用內建concat,concat_ws,substring和substring_index來提取出大寫首字母縮寫。

oracle和postgresql

使用內建函式replace,translate和rpad來提取出大寫首字元縮寫

sql server

不支援translate及concat_ws等函式

按字串中的部分內容排序

解決思路:找到並使用相應的dbms 的內建函式來提取出要據以排序的子字串,代表性的函式就是substr函式

db2, oracle,mysql和postgresql

聯合使用內建函式length和substr來按照字串指定的部分進行排序

sql server

使用substring和len來按照字串的指定部分進行排序

按字串中的數值排序

解決思路:不同的dbms中的解決方案使用的函式與語法都不盡相同,但是方法(使用內建的函式replace和translate)是相同的。具體就是使用replace和translate來從字串中刪除非數字字元,只留下用於排序的數字值。

db2

使用內建函式replace和translate來根據字串中的數字字元排序

oracle

使用內建函式replace和translate來根據字串中的數字字元排序

postgresql

使用內建函式replace和translate來根據字串中的數字字元排序

mysql和sql server

不支援translate函式

根據表中的行建立乙個分隔列表

解決思路:找到對應dbms中的內建函式,來解決

db2

使用遞迴的with函式來構建分界列表

mysql

使用內建函式group_concat來構建分隔列表

oracle

使用內建函式sys_connect_by_path來構建分隔列表

postgresql

不提供用來建立分隔列表的函式,所以必須預先知道在這個列表中將有多少值。知道對打列表的大小,就可以判斷需要新增的項數,從而用標準的變換和連線操作來建立分隔列表。

sql server

使用遞迴的with函式來構建分隔列表

將分隔資料轉換為多值in列表

解決思路:將字串分解為各個單獨的empno。遍歷字串,但並不是乙個字元乙個字元的遍歷,而是將這個字串轉換成有效的empno值。

db2

通過遍歷傳遞給in列表的字串,使用函式row_nomber,locate和substr

mysql

通過遍歷傳遞給in列別的字串,可以輕鬆的將其轉換為若干行

oracle

通過遍歷傳遞給in列別的字串,使用rownum,substr和instr

postgresql

通過遍歷傳遞給in列別的字串,使用函式row_nomber,charindex和substring

按字母順序排序字串

db2

遍歷每個字串,然後對其中的字元進行排序

mysql

使用group_concat函式,該函式不僅將構成的字元連線起來,還對它們進行排序

oracle

使用函式sys_connect_by_path允許以迭代方式構建一張列表

postgresql

不支援內建函式,所以在遍歷錢哥字串之外,還需要預先知道姓名的最大長度,在這種解決方案中,使用檢視v來增加它的可讀性

sql server

按照字元順序排列各行字串中的字元,需要遍歷每個字串,然後將這些字元排序

判別可作為數值的字串

解決思路:使用函式replace和translate對於操作字串和單獨的字元非常有用。關鍵就是先將所有的數字準換成同乙個字元,這樣就可以很輕易的通過乙個字元將數字隔離並識別出來,然後將去除了數字的剩餘字元和原本字元作比較,存在的轉換為#,轉化完成後,刪除#,剩下的就是數字了。

db2

使用translate,replace,posstr函式來隔離每一行彙總的數字字元。必須呼叫cast,使用replace來刪除多餘的空白

mysql

因為沒有函式translate,所以必須遍歷每一行,並且給予乙個字元地計算

oracle

使用translate,replace,posstr函式來隔離每一行彙總的數字字元。不必呼叫cast,使用replace函式來刪除多餘的空白。

postgresql

使用translate,replace,posstr函式來隔離每一行彙總的數字字元。不必呼叫cast,使用replace函式來刪除多餘的空白 

sql server

使用內建函式isnumeric配合使用萬用字元搜尋可以輕易的識別包含數字的字串。但是將數字從字串中提取出來不易,因為不支援translate

提取第n個分隔的子串

解決思路:將每個子串作為單獨的行返回,並保留每個子串在列表中的順序。

db2

使用函式row_number只保留每個字串中的第n個子串

mysql

根據逗號的位置,來只返回每個字串中的第n個子串

oracle

使用substr和instr函式來找到每個列表中的第n個子串

postgresql

使用split_part函式將每個單獨的子串作為一行返回

sql server 

使用函式row_number來保留每個字串中的第n個姓名

分解ip位址

解決思路:使用內建函式找到點的位置及前後的數字

db2和sql server

使用遞迴的with字句來模擬對ip位址的反覆處理,使用usbstr函式將其分解。在ip位址前加乙個句點,使得每組數字前面都有句點,或在後面新增。

mysql

使用substr_index函式可以輕鬆的分解ip位址

oracle

使用內建的substr和instr來分解ip位址

postgresql

使用內建函式split_part來分解ip位址

SQLCookbook 學習筆記

許多人以一種馬馬虎虎的態度在使用sql,根本沒有意識到自己掌握著多麼強大的 本書的目的是開啟讀者的視野,看看sql究竟能幹什麼。一鱗半爪 從資料庫中檢索資料看似是一件容易的事情,然而,在it世界裡,盡可能高效地檢索資料至關重要。讀完本書,你不應該覺得要將現在所有 重寫,而是要認識到,現在sql已經有...

SQLCookbook 學習筆記 1檢索記錄

特殊字元 表示 所有列 使用 和指定某個列 效能相同。使用where 指定 要保留哪些行 判斷某個字段 是非為空 用 is null 或者 is not null 如 mysql select from menpiao where logdate is null 在使用 and 和or 的時候,可以...

SQLCookbook 學習筆記 5元資料查詢

元資料是關於資料的資料 列出所有的 表 select table name from information schema.tables 列出所有的列。select from information schema.columns 列出表的索引 show index from emp 列出表約束 se...