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...