Возникают проблемы с возвратом строк таблицы с использованием оператора 'LIKE' - PullRequest
1 голос
/ 04 февраля 2012

Я новичок в программировании баз данных, и у меня возникают проблемы с поиском в моей базе данных. У меня есть таблица со столбцом с именем Required_Items, это просто список обязательных элементов, разделенных ';'. Я не могу заставить сервер возвращать строки при запросе:

'SELECT * FROM The_Table WHERE Required_Items LIKE '%item1%' '

Кажется, база данных не может найти этот элемент в столбце. Проблема в том, что я хочу иметь возможность возвращать строки, которые содержат ВСЕ элементы. Я бы попробовал что-то вроде:

'SELECT * 
 FROM The_Table 
 WHERE Requiered_Items LIKE '%item1%' AND 
       Requiered_Items LIKE '%item2%' AND 
       Requiered_Items LIKE '%item3%' AND//etc...

Как я могу это сделать, зная, что для проверки этих переменных "число переменных" будет

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Когда у меня возникают подобные проблемы, неизменно оказывается, что строки сравнения просто не совпадают.(Это не значит, что они не выглядят так, как будто они соответствуют .) Распространенными причинами являются орфографические ошибки, проблемы в верхнем и нижнем регистре, символы (особенно пробелы) не такие, какими они кажутся.У вас есть пробелы в любом из ваших «похожих» сравнений?

Как вы получили данные в базу данных?Вы скопировали его из Word или Excel и вставили в конструктор SQL-запросов, или что-то в этом роде?Это может вызвать проблемы, если вы не будете осторожны.

И, конечно, вы знаете, что ВСЕ ваши «подобные» сравнения должны совпадать, чтобы получить данные ...?

Вот пример того, что может происходить:

Если в поле «Необходимые предметы» = «Летучая мышь, Шар, Перчатка, Шапка, Шлем, Водная битва», оба эти параметра завершатся неудачно:

...where Required_Items like '%Bat%'
         and              ...'%Water Bottle%'

...where Required_Items like '%Glove%'
         and              ...'%Water Bottle%'

(поскольку в базе данных неправильно написано «Бутылка с водой»)

Вы можете устранить эту проблему, если в предложении where будет по одному элементу за раз, пока не найдететот, который терпит неудачу.

Что касается переменного количества элементов, то при использовании данных в том виде, как вы их настроили (все элементы в одном поле csv), ваш код может быть наиболее чистым, если вы используете динамический sql.Вот где вы строите запрос в строку vaiable и выполняете переменную.Ищите «Динамический SQL».

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

__The_Table_______      __Thing_Items____      __Items_______________
Thing_ID  Thing         Thing_ID  Item_ID      Item_ID  Item               
--------  --------      --------  -------      -------  --------------     
T1        Baseball      T1        i1           i1      Ball               
T2        Football      T1        i2           i2      Bat                
T3        Fishing       T1        i5           i3      Shoulder Pads      
                        T2        i1           i4      Worms              
                        T2        i3           i5      Water Bottle       
                        T2        i5                                       
                        T3        i4                                       
                        T3        i5                                       

Эта структура сделает обработку неизвестного количества элементов очень легкой.

Если выне можете решить, опубликуйте фактический код и фактические данные, если можете.

Скотт

0 голосов
/ 04 февраля 2012

Вы не можете просто бросить «любое количество» аргументов в фиксированный оператор SQL, или это все одна строка, и вам требуется точное или частичное совпадение для всей строки.Если вам нужно запрашивать различное количество элементов в запросе, вам понадобится программный средний уровень, который может подсчитывать количество поисковых терминов и создавать соответствующий оператор SQL на лету.

0 голосов
/ 04 февраля 2012

Этот запрос выглядит правильно.Вы можете использовать полнотекстовый индекс и полнотекстовый запрос, чтобы получить результат тоже.Например: выберите * из таблицы, в которой содержится (Columns_list, ' item1 ')

Попробуйте прочитать как получить результаты быстрее .

...