如何在oracle中查找行之间最长的公共子字符串?

如何在oracle中查找行之间最长的公共子字符串?,oracle,stored-procedures,Oracle,Stored Procedures,在我的oracle数据库中,我希望找到最长的公共子字符串。 例如: \roomname\nameid\department\foledertest\foldername\a.txt \roomname\nameid\department\foledertest\foldername\forlder1\a.txt \roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt 所以我希望结果是: \roomnam

在我的oracle数据库中,我希望找到最长的公共子字符串。 例如:

\roomname\nameid\department\foledertest\foldername\a.txt
\roomname\nameid\department\foledertest\foldername\forlder1\a.txt
\roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt
所以我希望结果是:

\roomname\nameid\department\foledertest\foldername\
有人有办法帮我吗,谢谢

Oracle 11g R2架构设置:

问题1:

:

更新-如果要将其限制为完整的子文件夹,则只需将输出截断为最后一个\字符:

Oracle 11g R2架构设置:

问题1:

:

您可以使用函数,该函数以一组值作为参数,并返回出现频率最高的值:

select stats_mode(field_name) 
  from table_name
返回

\roomname\nameid\department\foledertest\foldername\a.txt
然后,在这种情况下,您可以使用类似于子字符串的函数来仅捕获路径:

select substr(common, 1, instr(common, '\', -1))
  from (select stats_mode(field_name) as common 
          from table_name);

一般来说,您真的需要子字符串吗?或者仅仅从子字符串开始就足够了?为什么不是\roomname\nameid\department\FolderTest\foldername\?我希望子字符串是常规字符串。根据您的响应,您通常不需要子字符串,您需要最长的共享父目录,假设\root\dir1\dir\引用文件系统中的目录。例如,\roomname\nameid\dep和\roomname\nameid\department仅将\roomname\nameid作为目录共享,但将\roomname\nameid\dep作为字符串共享。感谢您的帮助,但是,如果我创建了表more foldername\u 1,则结果仅显示\roomname\nameid\department\foldertest\foldername`我希望显示更多结果\roomname\nameid\department\foldername\u 1`。你可以在下面看到我的问题。非常感谢MUCH@John.D更新了hanks,但我希望得到2个结果\roomname\nameid\department\foldertest\foldername\roomname\nameid\department\foldertest\foldername\u 1
CREATE TABLE files ( name ) AS
SELECT '\roomname\nameid\department\foledertest\foldername\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername_1\a.txt' FROM DUAL;
WITH names ( name ) AS (
  SELECT SUBSTR( name, 1, MIN( LENGTH( name ) ) OVER () )
  FROM   files
),
substrs ( common, num_matches ) AS (
  SELECT name,
         COUNT( DISTINCT name ) OVER ()     
  FROM   names
UNION ALL
  SELECT SUBSTR( common, 1, LENGTH( common ) - 1 ),
         COUNT( DISTINCT SUBSTR( common, 1, LENGTH( common ) - 1 )  ) OVER ()     
  FROM   substrs
  WHERE  num_matches > 1
  AND    LENGTH( common ) > 1
)
SELECT SUBSTR( common, 1, INSTR( common, '\', -1 ) ) AS common
FROM   substrs
WHERE  num_matches = 1
AND    ROWNUM = 1
|                                   COMMON |
|------------------------------------------|
| \roomname\nameid\department\foledertest\ |
select stats_mode(field_name) 
  from table_name
\roomname\nameid\department\foledertest\foldername\a.txt
select substr(common, 1, instr(common, '\', -1))
  from (select stats_mode(field_name) as common 
          from table_name);