我使用Oracle DB。我有兩個字段A
和B
。 我必須檢索那些行,其中A<>B
。 問題是A
可能是'12|14|15'
和B
可能是'12|15|14'
。 所以,他們實際上是一樣的,只是數字的順序是不同的。 如何檢索字段實際上不相等的行 ,如'30|31|14'
和'31|30|15'
或'22|23'
和'22'
?在oracle中分割字符串和比較字段
請提出解決方案。
我使用Oracle DB。我有兩個字段A
和B
。 我必須檢索那些行,其中A<>B
。 問題是A
可能是'12|14|15'
和B
可能是'12|15|14'
。 所以,他們實際上是一樣的,只是數字的順序是不同的。 如何檢索字段實際上不相等的行 ,如'30|31|14'
和'31|30|15'
或'22|23'
和'22'
?在oracle中分割字符串和比較字段
請提出解決方案。
解決方案是規範化您的表。其他解決方案都很複雜且效率低下。
做適當的標準方法是使用分層查詢或流水線表函數將值拆分爲列(即規範化它們),然後比較這種方式,但如果你有一定數量的管道,那麼你應該能夠使用標準的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,並且不能直接比較空值。
正如我說的,規範的數據庫,但...要簡單得多。
謝謝!但是,如果所有行中的管道數不相同,是不是可能? – user1097217
只要您知道任何行@ user1097217中的最大管道數,就有可能。 – Ben
這可能不是最好的解決方案,但恕我直言,這是更有趣然後拆分記錄,然後再重聚集他們
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()
謝謝你的迴應。但是,請你稍微解釋一下。 – user1097217
首先,我通過用''(並連接開始和結束標記)代替'|'來創建一個xml,然後我使用xsl變換隻獲取值,但是排序(所以'14 | 15'將會是'1415'和'15 | 14'也將是'1415') –
我最初的想法是使用'XMLDIFF'來檢查2個字符串是否相同或不相等,但是它顯然是指順序至... –
爲什麼downvote? –
可能是因爲工具提示@ A.B.Cade(不是我):_「這個問題沒有顯示任何研究工作」_ – Ben