程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 淺談sql的字符分割,淺談sql字符分割

淺談sql的字符分割,淺談sql字符分割

編輯:Oracle教程

淺談sql的字符分割,淺談sql字符分割


   對於oracle;在字符串處理時;經常會遇到字符串分割的問題;可惜SQL中沒有split函數;這個倒是挺困擾我們寫sql的。對此;我來說說這字符串分割。

  例如對字段str中一條數據是'120-mm-265';我要取到其中的mm。若對其它語言之間;例如awk。split("120-mm-265",a,"-");print a[2];就搞定了。

  1. 可能大家覺得很簡單;我用substr(str,5,2)就行了。可惜你把問題想得太簡單了。我們處理是多條數據;而不是一條數據。若它下面一條的數據是'12-oko-45'。這樣的話 。那就是ko;並非我們想要的oko

  2. 可能大家還會想到instr函數。這個函數是可以解決的。但是還是要借用sbustr函數

SELECT substr('120-mm-265',
				instr('120-mm-265', '-', 1, 1) + 1,
				instr('120-mm-265', '-', 1, 2) -
				(instr('120-mm-265', '-', 1, 1) + 1))
 FROM   dual

  這樣的結果大家可以接受嗎?

  3. 兩年前;我想到一種方法。就是借用ltrim,rtrim函數。由於前面和後面都是數字

SELECT rtrim(ltrim('120-mm-265', '0123456789-'), '0123456789-')
FROM   dual;

  這種情況是可以實現。但是這種情況呢'20m-mm-f25'。這種實現擴展性不強。所以這種也不考慮。

  4. 由於上面3種寫法;大家能接受嗎?不能接受;那就進入高級寫法。
   使用正則函數。

       SELECT regexp_substr('120-mm-265', '[^-]+', 1, 2)
       FROM   dual;   --推薦這種。
   
       SELECT regexp_replace('120-mm-265', '(.*)-(.*)-(.*)', '\2')
       FROM   dual;

 我相信這兩種方法應該可以讓你滿意;若還不能讓你滿意;那就是正則函數是10g版本才有的。若低於10g版本,那該怎麼辦?那就看看下面吧

  5. 自定義函數split。oracle不提供內置函數split。那麼就自定義。

 CREATE OR REPLACE FUNCTION splitstr
         (
    v_desc   VARCHAR2(200),
    v_icount NUMBER
) RETURN VARCHAR IS
    v_result  VARCHAR(20);
    v_pos     NUMBER(2);
    v_str     VARCHAR(1000);
    v_count_2 NUMBER(2);
    v_word    VARCHAR(20);
BEGIN
    v_result  := '';
    v_str     := v_desc || ',,,';
    v_count_2 := 0;
    v_pos     := instr(v_str, ',');
    WHILE v_pos > 1
    LOOP
        v_count_2 := v_count_2 + 1;
        v_word    := substr(v_str, 1, v_pos - 1);
        IF v_icount = v_count_2 THEN
            v_result := v_word;
            RETURN v_result;
        ELSE
            IF v_icount < v_count_2 THEN
                RETURN '';
            ELSE
                IF v_str <> ',' THEN
                    v_str := substr(v_str, v_pos + 1);
                    v_pos := instr(v_str, ',');
                END IF;
            END IF;
        END IF;
    END LOOP;
    RETURN v_result;
END splitstr

    我們就這樣執行
      SELECT splitstr(replace('120-mm-265','-',','),2) from dual
    這樣執行就ok
   若還有好點的方法到時候再補充;若大家有好點的方法也可以補充。


sql分割字符串

看你是什麼數據庫。
在Sql Server裡面,不支持類似正則的方式拆分,只能使用字符串函數。
LEFT(name,CHARINDEX('.',name,0)) 這樣的方式獲取
中間部分可以用SUBSTRING代替LEFT實現
 

sql 分割字符串

select SUBSTRING (A列 , 1 ,CHARINDEX ( ' ' , A列 ) ) from A表
這個可以把A列空格前的字符取出來。
更新
update A表 set B列=(select SUBSTRING (A列 , 1 ,CHARINDEX ( ' ' , A列 ) ))
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved