2013-10-25 36 views
1

我有一個有趣的問題,並不能解決它。請幫忙!!!!oracle sql select與僱員

他們是表

t_employee 
    ID    NUMBER, 
    DEPARTMENT_ID NUMBER, 
    CHIEF_ID  NUMBER, 
    NAME   VARCHAR2(100 BYTE), 
    SALARY   NUMBER, 
    BIRTH_DATE  DATE, 
    ADDRESS  VARCHAR2(200 BYTE), 
    STATUS   VARCHAR2(1 BYTE) 

t_department 
    ID NUMBER, 
    NAME VARCHAR2(100 BYTE) 

需要顯示的員工在每個地區的電話號碼 - 在ADRESS列(如果他們現在區域然後= '沒有' 區)。 轉換爲大寫字母的區域名稱。

什麼是問題?問題是,ADRESS collumn具有例如非結構化數據: 地址:

Country,REGION,city,... 

所以REGION總是必須beetween第一(,)和第二(,),並且必須包括字(REG) 例如:

Russia(Country), reg Moskovskay , Moscow(city), Lenina, (street) .... or 
Russia(Country), Moskovskay reg , Moscow(city), Lenina, (street) .... or 

分隔符是(,) 位置 - 第二

非常感謝!

+1

offtopic,但壞表設計... – Apostolos

+0

您的預期產出是什麼?你能把它放在表格格式中嗎? – Rachcha

回答

1

自由格式字符串在數據庫中很少是一個好主意,這個查詢將不能使用索引,這很可能會使它成爲一個慢速執行者;

WITH a AS (SELECT TRIM(
        REPLACE(
        UPPER(
         REGEXP_SUBSTR(ADDRESS, ',([^,]*),', 1, 1, 'i', 1) 
        ), 
        ' REG ', '' 
        ) 
        ) REGION 
      FROM t_employee) 
SELECT REGION, COUNT(*) cnt FROM a GROUP BY REGION 

An SQLfiddle to test with

+0

一個非常全面的答案+1 – Rachcha

0

首先,請瀏覽並更改數據庫設計以區分這些字段。它將從長遠角度幫助您。如果您仍想繼續使用此結構,則可以管理數據庫中的數據插入本身時需要的格式。希望有幫助!

1

嘗試以下:

SELECT regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1) AS region, COUNT(*) 
FROM t_employee 
GROUP BY regexp_substr(address, ',(.*?reg.*?),', 1, 1, null, 1); 

我會強烈建議然而重構的模式,打破地址轉換之前或工作臺承重期間街道,城市,區域等不同的領域,只要你有這樣做的可能性。

+0

這一個也提供了短期代碼所需的解決方案。 – Rachcha

+0

非常感謝。它不是單獨的領域... – user2834458

0
WITH t_employee AS (
    SELECT 1 AS id, 10 AS department_id, 'a' AS name, 'kws, aaa reg, skdir, 23049' AS address FROM dual 
    UNION ALL SELECT 2, 10, 'b', 'slkx, aaa reg, lskdj, 902349' FROM dual 
    UNION ALL SELECT 3, 20, 'c', 'lskj, bbb reg, lskdi, 489308' FROM dual 
    UNION ALL SELECT 4, 10, 'd', 'lskj, aaa reg, lskdi, 489308' FROM dual 
    UNION ALL SELECT 5, 20, 'e', 'lskj, ccc reg, lskdi, 489308' FROM dual 
    UNION ALL SELECT 6, 30, 'f', 'lskj, bbb reg, lskdi, 489308' FROM dual 
) 
, t_region AS (
SELECT id, 
     TRIM (
      REPLACE (
         SUBSTR (address, 
           INSTR (address, ',', 1) + 1, 
           INSTR (address, ',', INSTR(address, ',', 1) + 1) 
                - INSTR(address, ',', 1) - 1), 
         'reg', 
         '') 
      ) 
     AS region 
    FROM t_employee e 
) 
    SELECT r.region, count(*) AS employees 
    FROM t_region r 
GROUP BY r.region 
; 
+0

這是非常難的思考! – user2834458