【问题标题】:split string and compare field in oracle在 oracle 中拆分字符串和比较字段
【发布时间】:2013-10-24 03:31:57
【问题描述】:

我使用 Oracle 数据库。 我有两个字段AB。 我必须检索A<>B 所在的那些行。 问题是A 可能是'12|14|15'B 可能是'12|15|14'。 因此,它们实际上是相同的,只是数字的顺序不同。 如何检索字段确实不相等的行 ,比如'30|31|14''31|30|15',或者'22|23''22'

请提出解决方案。

【问题讨论】:

  • 可能是因为工具提示@A.B.Cade(不是我):“这个问题没有显示任何研究工作”

标签: oracle substring


【解决方案1】:

解决方案是规范化您的表格。其他所有解决方案都是复杂且低效的。

正确的标准方法是使用分层查询或流水线表函数将值拆分为列(即规范化它们),然后以这种方式进行比较,但如果您有有限数量的管道,那么您应该能够使用标准的SUBSTR()INSTR() 函数在管道上拆分并进行比较。

将管道连接到要搜索的字符串的末尾,然后按照以下方式将其拆分,然后在第二个字符串中搜索您要查找的字符串:

with the_string as (
 select '|' || '12|14|15' || '|' as str1
      , '|' || '12|15|14' || '|' as str2
   from dual
        )
select substr(str1, instr(str1, '|', 1, 1), instr(str1, '|', 1, 2))
     , substr(str1, instr(str1, '|', 1, 2), instr(str1, '|', 1, 3) - instr(str1, '|', 1, 2) + 1)
     , substr(str1, instr(str1, '|', 1, 3), instr(str1, '|', 1, 4) - instr(str1, '|', 1, 3) + 1)
  from the_string
 where str2 like '%' || substr(str1, instr(str1, '|', 1, 1), instr(str1, '|', 1, 2)) || '%'
   and str2 like '%' || substr(str1, instr(str1, '|', 1, 2), instr(str1, '|', 1, 3) - instr(str1, '|', 1, 2) + 1) || '%'
   and str2 like '%' || substr(str1, instr(str1, '|', 1, 3), instr(str1, '|', 1, 4) - instr(str1, '|', 1, 3) + 1) || '%'

当字符串长度相同但内容不同时,不会返回任何内容,因为内容不同,当字符串长度不同时,不会返回任何内容,因为返回的“值”之一将为 NULL,您不能直接比较空值。

SQL Fiddle

正如我所说,标准化您的数据库虽然...简单得多。

【讨论】:

  • 谢谢!!但是,如果所有行中的管道数量都不相同,那不是可能吗?
  • 只要知道@user1097217任意行的最大管道数就可以。
【解决方案2】:

这可能不是最好的解决方案,但恕我直言,然后拆分记录然后重新收集它们会更有趣

with xslt as
(select xmltype('<?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
       <xsl:template match="/"><xsl:for-each select="//b">
         <xsl:sort select="."/><xsl:value-of select="."/>
</xsl:for-each></xsl:template></xsl:stylesheet>') xsl from dual)

select t.*
from t, xslt
where xmltype('<r><b>'||replace(a, '|', '</b><b>')||'</b></r>').transform(xsl).getstringval() <>
xmltype('<r><b>'||replace(b, '|', '</b><b>')||'</b></r>').transform(xsl).getstringval()

Here is a sqlfiddle demo

【讨论】:

  • 感谢您的回复。但是,你能解释一下吗?
  • 首先 - 我通过将 | 替换为 &lt;/b&gt;&lt;b&gt; (并连接开始和结束标签)将它变成了一个 xml,然后我使用 xsl 转换仅获取值,但已排序(所以@ 987654325@ 将是 141515|14 也将是 1415
  • 我最初的想法是使用XMLDIFF 来检查变成 2 个 xml 的 2 个字符串是否相同,但显然它指的是顺序...
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2013-11-30
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多