Oracle喜欢'124%字符串不起作用

时间:2018-03-31 11:01:36

标签: sql oracle

如何找到像我的要求一样的数据col1是clob col中的列值,如: -

12.5.4 12.4 12.5 12.4.1 12.5 12.6 12.5 12.5 12.4

我需要查找数据,其中12.4在开头,中间和结尾,如果我运行此查询以获得12.4在数据中间不能正常工作

SELECT * FROM TABLE WHERE COL1 LIKE ' %12.4 '

我的专栏CLOB列需要查找CLOB列中按空格分隔的数据

实施例

12.4 12.5 12.4.1 

12.5 12.4 12.5

12.4.1 12.4.5 

12.5.1 12.4 12.4.1

我将CLOB列中的数据用空格分隔 12.4可以是数据的第一个值或中间值或数据的结尾

first row  12.4 12.5 12.6.1
second row 13.5 12.4 12.6.2
third row  12.5 14.5.1 12.4
fourth row 12.4.1 12.6 12.7

我需要前3行而不是第4行,因为它有12.4.1

5 个答案:

答案 0 :(得分:2)

使用双%代替:

SELECT * FROM myTABLE WHERE COL1 LIKE '%12.4%';

这一次与你的文字在哪里无关。

此外,可以使用绑定变量对不同的值进行参数化:

SELECT * FROM myTABLE WHERE COL1 LIKE '%'||'&x'||'%' -- x := 12.4 or a value else.

答案 1 :(得分:2)

  

我需要找到12.4开头,中间和结尾的数据

从您的问题中不清楚您是否要匹配任何包含12.4(如12.4.1)或只是12.4项的项目。我以为你想要完全匹配。

仅在中间搜索值的最简单方法是LIKE '% 12.4 %'。但是如果12.4位于列值的开头或结尾,则不匹配,因为在值之前/之后不会有匹配的空格。

解决这个问题的一个技巧是在列值的开头和结尾连接空格:WHERE ' ' || COL1 || ' ' LIKE '% 12.4 %'

另一种方法是明确涵盖所有可能性:WHERE ( COL1 LIKE '12.4 %' OR COL1 LIKE '% 12.4' OR COL1 LIKE '% 12.4 %')

答案 2 :(得分:2)

我怀疑你只想在单词边界(开头,中间和结尾作为单独的文字)匹配12.4所以,使用下面的REGEXP模式。

SELECT * FROM TABLE WHERE 
REGEXP_LIKE(COL1 ,'(^|\s)12.4($|\s)');

Demo

答案 3 :(得分:0)

当我在sql小提琴中测试时,这是有效的。

   select *
    from table1
    where instr(replace(col1,' ','|'), '12.4|') > 0
    or    instr(replace(col1,' ','|'),'|12.4|') > 0
    or    instr(replace(col1,' ','|'),'|12.4') > 0;

编辑:之前的答案在sqlfiddle中有效,但对Reena无效。我在上面添加了另一个使用instr的答案(在此列中找到此字符串)。返回给定列中搜索字符串的位置。

Replace space with pipe then do a regular like query.
    select *
    from table1
    where replace(col1,' ','|') like '12.4|%'
    or replace(col1,' ','|') like '%|12.4|%'
    or replace(col1,' ','|') like '%|12.4';

答案 4 :(得分:0)

您的解释,要求和数据仍不明确。但也许这个非常简单的解决方案可以帮助你,至少作为一个想法。看看我的例子中的第6行。在这种情况下你的要求是什么?并且Kaushik Nayak查询有效。

WITH test_data AS
(
SELECT 1 rn, '12.4 12.5 12.6.1' str FROM dual
UNION ALL
SELECT 2,    '13.5 12.4 12.6.2' FROM dual
UNION ALL
SELECT 3,   '12.5 14.5.1 12.4' FROM dual
UNION ALL
SELECT 4,   '12.4.1 12.6 12.7' FROM dual
UNION ALL
SELECT 5,   '12.4.1 12.4.6 12.4.7' FROM dual
UNION ALL
SELECT 6,   '12.4 12.4.1 12.4' FROM dual
)
SELECT rn, str FROM test_data
 WHERE str Like '%12.4%'
MINUS
SELECT rn, str FROM test_data
 WHERE str Like '%12.4.%'
ORDER BY 1
/

输出:

12.4 12.5 12.6.1
13.5 12.4 12.6.2
12.5 14.5.1 12.4