2015-07-08 2 views
1

Есть ли вероятность найти точное значение в varchar с использованием oracle sql?Oracle найти значения в varchar

Мне нужно найти точное значение в строке (см. Вывод).

Это мой SQL выход:

Rights (varchar) 
----- 
#1 (ID IN (1560 , 1760 , 1860 , 20200 , 3530, 16000)) 
#2 (ID IN (1600 , 20000 , 100000)) 

Я хочу, чтобы фильтровать, например, Струнный 1600 и 1660.

В этом случае должно быть указано только #2.

Я пробовал and table1.rights like '%1600%', который, конечно же, не работает, потому что он показывает мне #1, а это неправильно.

Я также нашел, что это об использовании раскол, который я не могу интегрировать

http://lalitkumarb.com/2014/12/02/split-comma-delimited-string-into-rows-using-oracle-sql/

Любые идеи?

+1

Вы можете разделить ваши строки, но не 'как«% 1600%» 'работы (с пробелами)? –

+0

Не нужно разделить строку, 'LIKE '% 1600%'' будет работать нормально. –

ответ

2

Я также нашел, что это об использовании раскол, который я не могу интегрировать

http://lalitkumarb.com/2014/12/02/split-comma-delimited-string-into-rows-using-oracle-sql/

Хорошо видеть кого-то следующие мои блоги и статьи :-)

Не нужно разделять строку, используйте LIKE следующим образом, который будет рассматривать только пробел перед/после 1600 и без каких-либо других персонажей:

SQL> WITH DATA(str) AS(
    2 SELECT '#1 (ID IN (1560 , 1760 , 1860 , 20200 , 3530, 16000))' FROM dual UNION ALL 
    3 SELECT '#2 (ID IN (1600 , 20000 , 100000))' FROM DUAL 
    4 ) 
    5 SELECT * FROM DATA 
    6 WHERE str LIKE '% 1600 %'; 

STR 
---------------------------------------------------------- 
#2 (ID IN (1600 , 20000 , 100000)) 

SQL> 
+1

Еще раз спасибо за помощь - ваш блог мне очень помог до сих пор! Я стажер, и, к сожалению, мне никто не помогает в компании - извините за то, что иногда задавали глупые вопросы! Держите блог! :) – piguy

+0

@piguy Добро пожаловать! –

1

Узнайте, поддерживает ли ваша версия базы данных Oracle REGEXP_LIKE (похожа на LIKE). В можно написать регулярное выражение, что-то как это,

SELECT * FROM table1 WHERE REGEXP_LIKE (rights, ' (,|[:blank:]|\()16(00|60)(,|[:blank:]|\))'); 

Edit: Я просто улучшить выражение рег следующие замечания. Он будет работать, даже если некоторое пространство отсутствует. Для поиска любых других значений вам нужно только изменить значение в середине выражения.

См regular expression syntax слишком

+2

В вашем шаблоне отсутствует закрывающая скобка и внешние квадратные скобки - так '' 16 (00 | 60) (, | [[: blank:]]) ''будет работать. Но это также соответствует, скажем, 11600, поэтому вам нужно будет проверить, что еще до того, как это необходимо. –

+1

Регулярное выражение было бы проще, если бы оракул поддерживал оператор границы слова \ b. Также обратите внимание, что комментарий @Alex верен, и вам нужно выполнить граничные проверки в начале выражения. –

Смежные вопросы