Oracle LIKE不工作

时间:2016-12-22 09:31:07

标签: sql oracle

尝试从SQL环境中掌握Oracle。 有谁知道为什么这个查询返回0?

SELECT COUNT( * ) FROM MORGS.LOGS l
WHERE ( l.LOCATION = 'X:\Import\XXX006' ) AND
      ( l.DIRECTION = 'IN' ) AND
      ( 'XXX006-Test.txt' LIKE '%XXX006.D$Date,YYYYMMDD$.T$Date,HHNNSS$%' ) -- It fails on this condition

请注意' XXX006-Test.txt'在LIKE的左侧是表中列的值。我在这里只是为了演示而硬编码。

提前致谢。

1 个答案:

答案 0 :(得分:2)

其实LIKE正在发挥作用。我担心你的逻辑是错误的。 LIKE的前提是第一个参数中的整个文本在第二个参数中全部存在 ,并使用通配符从匹配中省略不相关的字符。

所以这是真的......

where 'ABC' like 'ABC%'

......这是假的......

where 'ABC' like 'ABCDEF'

看看你的实际测试:

( 'XXX006-Test.txt' LIKE '%XXX006.D$Date,YYYYMMDD$.T$Date,HHNNSS$%' ) 

我们注意到XXX006-Test.txt中不存在字符串XXX006.D$Date,YYYYMMDD$.T$Date,HHNNSS$所以LIKE非常正确地返回FALSE。

  

"你知道我怎么能把RHS分成一个'。'并且只抓取拆分结果的第一个索引,即' XXX006'?"

如果所需的匹配总是六个字符,那么最简单的就是

substr('XXX006-Test.txt', 1, 6)

如果主要内容是变量,则可以使用正则表达式。要在点之前提取所有内容:

 regexp_replace ( 'XXX006-Test.txt',  '(.+)\.txt$','\1'  )

虽然给出了两个字符串中的值,但您可能希望在短划线上匹配...

 regexp_replace ( 'XXX006-Test.txt',  '([a-z0-9]+)\-(.*)','\1' )

取决于模式的稳定性。