簡體   English   中英

oracle function 用於: select 從逗號分隔的字符串計數

[英]oracle function for: select distinct values count from comma separated string

我需要一個 Oracle (11) function 來處理這個問題。 我需要從逗號分隔的字符串中計算不同的值。

例如逗號分隔的字符串:'Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text'

結果必須是 = 6

由於

  1. 洛雷姆
  2. 伊普蘇姆
  3. 簡單地
  4. 文本

我想這樣使用

select fn_dist_count_values_in_list_arr('Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text') from dual;

誰能幫忙寫這個(“fn_dist_count_values_in_list_arr”)oracle function?

您不需要從 SQL 到 PL/SQL function 的上下文切換,並且可以在 SQL 中完成所有操作:

SELECT ( SELECT COUNT( DISTINCT CAST(column_value AS VARCHAR2(20)) )
         FROM   XMLTABLE( ('"'||REPLACE(value,',','","')||'"') ) )
         AS num_distinct_values
FROM   table_name

其中,對於樣本數據:

CREATE TABLE table_name ( value ) AS
SELECT 'Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text' FROM DUAL;

輸出:

  |  NUM_DISTINCT_VALUES |  |  ------------------: |  |  6 |

如果你想要一個純 PL/SQL function(這樣你就沒有多個上下文切換),那么:

CREATE FUNCTION fn_dist_count_values_in_list_arr (
  list_value IN VARCHAR2
) RETURN NUMBER DETERMINISTIC
IS
  TYPE t_words IS TABLE OF NUMBER(1,0) INDEX BY VARCHAR2(200);
  v_words t_words;
  v_start PLS_INTEGER := 1;
  v_end   PLS_INTEGER;
BEGIN
  IF list_value IS NULL THEN
    RETURN 0;
  END IF;
  LOOP
    v_end := INSTR( list_value, ',', v_start );
    EXIT WHEN v_end = 0;
    v_words(SUBSTR(list_value, v_start, v_end - v_start ) ) := 1;
    v_start := v_end + 1;
  END LOOP;
  v_words(SUBSTR(list_value,v_start)) := 1;
  RETURN v_words.COUNT;
END;
/

接着:

SELECT fn_dist_count_values_in_list_arr( value )
FROM   table_name

輸出:

  |  FN_DIST_COUNT_VALUES_IN_LIST_ARR(VALUE) |  |  --------------------------------------------------: |  |  6 |

db<> 在這里擺弄

    CREATE OR REPLACE FUNCTION DIST_COUNT_VALUES_IN_STR_ARR
    (STR_ARR IN VARCHAR2)
    RETURN NUMBER
    AS
    DIST_COUNT NUMBER(38);
    BEGIN
        SELECT COUNT(DISTINCT COL1) 
        INTO DIST_COUNT FROM (
            SELECT REGEXP_SUBSTR(STR_ARR,'[^,]+', 1, LEVEL) COL1 
            FROM DUAL
            CONNECT BY LEVEL <= REGEXP_COUNT(STR_ARR, ',') + 1
        );
        RETURN DIST_COUNT;
    END;

這對我有用。 內部查詢通過在逗號字符上使用正則表達式將元素分成行。 我不得不重命名您的 function,因為我達到了 Oracle 版本的 object 名稱的最大長度限制。

另一種方法是使用分層查詢將逗號分隔值拆分為一組行(帶子句)並對其運行簡單的 sql 查詢

with str_parsed as (SELECT REGEXP_SUBSTR('Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text', '[^,]+', 1, LEVEL) val
                    FROM dual
                    CONNECT BY REGEXP_SUBSTR('Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text', '[^,]+', 1, LEVEL) IS NOT NULL)
select count(distinct val) from str_parsed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM