2012-04-26 3 views
1

Мне нужно найти все таблицы в нашей базе данных Oracle, которые имеют атрибуты, соответствующие определенному слову. Так, например, я использую:SQL Поиск определенного значения в строке

SELECT TABLE_NAME 
    , COLUMN_NAME 
    FROM USER_TAB_COLUMNS 
WHERE UPPER(COLUMN_NAME) LIKE '%ING%' 

Это возвращает:

TABLE1 ING 
TABLE2 THIS_ING 
TABLE3 ING_FIRST 
TABLE5 TESTING 

Я только хочу, чтобы возвращать результаты из Table1, TABLE2 и Table3. Мне не нужна совпадение, когда это только часть строки, такой как TESTING.

Кажется, я не могу получить именно то, что мне нужно.

+2

Hah, вы один из тех специфических видов, которые помещают запятую, чтобы предшествовать пункту на следующей строке. –

+2

Вы тоже один из этих видов? ха-ха, я взял эту привычку от друга, который является ветераном 20 лет DBA. Когда я это делаю, мне кажется, что это лучше. Кроме того, вы можете легко прокомментировать атрибут, вам также не нужно комментировать запятую в предыдущей строке, если вы хотите комментировать последний атрибут. – northpole

+0

Хорошая точка. Я реализую это с сегодняшнего дня. – rvphx

ответ

8

Вы можете использовать регулярное выражение, чтобы найти то, что вы хотите:

SELECT TABLE_NAME 
    , COLUMN_NAME 
    FROM USER_TAB_COLUMNS 
WHERE regexp_like (column_name, '(^|(_)+)ING((_)+|$)') 

Это даст вам столбцы, которые имеют ING предшествуют либо начало линии или 1 руды более подчеркивания, а затем в конце строки или 1 руды более подчеркиванием.

+0

Вот оно! Спасибо за помощь, этот сайт мне никогда не подводит. – northpole

+0

+1 приятный, что недолго для тех, кто действительно знал регулярное выражение, хотя мне любопытно [почему не просто (^ | (_) +) ING] (http://sqlfiddle.com/#!4/4c95a/29) –

+0

@ConradFrix Я не знаю, могу ли я сказать, что я знаю «регулярное выражение», но при достаточном количестве времени, усилий и удачи я могу что-то взломать (началось с него до того, как был отправлен ваш ответ). –

1

Вы можете использовать REGEXP_LIKE. Я не очень хорошо в регулярных выражениях, кто-то лучше, чем я мог понять, как это сделать либо начало слова или _ в одном выражении

SELECT TABLE_NAME 
,  COLUMN_NAME 
FROM USER_TAB_COLUMNS 
WHERE 
REGEXP_LIKE(COLUMN_NAME,'[_]ING') 
or 
REGEXP_LIKE(COLUMN_NAME,'^ING') 

DEMO

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