Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle sql与员工一起选择_Sql_Database_Oracle_Function - Fatal编程技术网

oracle sql与员工一起选择

oracle sql与员工一起选择,sql,database,oracle,function,Sql,Database,Oracle,Function,我有一个有趣的问题,无法解决。请帮忙 它们是桌子 t_employee ID NUMBER, DEPARTMENT_ID NUMBER, CHIEF_ID NUMBER, NAME VARCHAR2(100 BYTE), SALARY NUMBER, BIRTH_DATE DATE, ADDRESS VARCHAR2(200 BYTE), STATUS

我有一个有趣的问题,无法解决。请帮忙

它们是桌子

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)

需要在“地址”列中显示每个地区的员工人数(如果他们现在是地区,则为“否”区域)。 已转换为大写的区域名称

问题是什么?问题是Address collumn具有非结构化数据,例如: 地址:

所以区域必须在第一个(,)和第二个(,)之间,并且必须包含单词(reg) 例如:

Russia(Country), reg Moskovskay ,  Moscow(city), Lenina, (street)  .... or 
Russia(Country), Moskovskay reg ,  Moscow(city), Lenina, (street)  .... or
分隔符为(,) 排名第二


非常感谢

开始时,请查看并更改数据库设计以分隔这些字段。从长远来看,这将对您有所帮助。如果您仍希望坚持此结构,则可以在插入数据时以所需格式管理数据。希望有帮助

试试下面的方法:

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);

不过,我强烈建议您在加载表之前或期间重构模式,并将地址拆分为街道、城市、地区等单独的字段,如果您有可能的话。

自由格式字符串在数据库中很少是一个好主意,此查询将无法使用索引,这很可能使其执行速度较慢

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

.

主题外,但表设计不好…您的预期输出是什么?你能把它做成表格吗?一个非常全面的答案+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);
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
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
;