我使用的是Oracle DB。
我有两个字段A
和B
。
我必须检索那些A<>B
的行。
问题是A
可能是'12|14|15'
而B
可能是'12|15|14'
。
所以,它们实际上是相同的,只是数字的顺序是不同的。
如何检索字段实际上不相等的行
,例如'30|31|14'
和'31|30|15'
,或'22|23'
和'22'
?
请提出解决方案。
答案 0 :(得分:2)
解决方案是规范化您的表格。其他所有解决方案都很复杂且效率低下。
做正确的标准方法是使用分层查询或流水线表函数将值拆分为列(即规范化它们),然后比较这种方式,但如果你有有限数量的管道那么你应该能够使用标准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而您不能直接返回比较空值。
正如我所说,规范化你的数据库虽然......更简单。
答案 1 :(得分: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()