2013-05-11 4 views
1

Я хочу найти строку запроса типа apple в столбце FRUIT базы данных Access. Select * from table_name where FRUIT = "apple" отлично работает, когда мы ищем один срок.
Но колонка FRUIT содержит несколько терминов в своем значении, таких как банан, апельсин, яблоко и т. Д. (Например, теги). Таким образом, над SQL-запросом не работает, при поиске.
Также, как сделать SQL-запрос, когда пользователь хочет найти неопределенное количество терминов, например. он может попробовать яблоко или яблоко, апельсин или виноградное апельсиновое яблоко и т. д., если он может попытаться найти один или несколько терминов вместе.Ms-Access 2007 размещение строки в столбце с несколькими терминами

Примечание: Я также читаю http://msdn.microsoft.com/en-us/library/ms974570.aspx#scripting05_topic2 для решения вышеуказанной проблемы. Но все же я не понял, как использовать его для получения набора записей, который соответствует критериям поиска.

ответ

3

Так у вас есть поле в вашей таблице, которая может содержать несколько значений, как ...

banana, orange, apple

... и вы хотите быть способный искать записи, соответствующие одному (или более) из этих «тегов». Как поясняет ответ matzone, вы можете выполнить простую подстроку, используя либо InStr(), либо используя оператор SQL LIKE, как в WHERE Fruit LIKE "*apple*".

Однако это также приведет к тому, что строки «помечены» как «ананас». Чтобы избежать этой проблемы, вы должны включать разделители ...

WHERE Fruit LIKE "*, apple, *" 

... НО, если у вас нет передней и задней разделителей в своей области, то есть, ...

, banana, orange, apple,

... то вы не сможете найти «банан» в исходном примере, если вы не делаете ...

WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *")) 

... и вы выиграли» т быть в состоянии найти «банан» на конце из списка, если вы не делаете ...

WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *") OR (Fruit LIKE "*, banana")) 

(Даже если вы пытались использовать начальные и конечные ограничители, Access имеет привычку автоматически обрезки завершающие пробельные из полей, когда они редактируются, которые могли бы еще больше осложнить ситуацию.)

Теперь бросьте в требовании найти несколько «тегов», скажем, «банан» или «яблоко», и ваш ИНЕКЕ становится

WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *") OR (Fruit LIKE "*, banana")) 
    OR ((Fruit LIKE "*, apple, *") OR (Fruit LIKE "apple, *") OR (Fruit LIKE "*, apple")) 

Су re, вы можете построить этот тип запроса в коде VBA, но он начнет получать unweildy (и довольно неэффективно) довольно быстро.

Моя рекомендация: Устранить структуру данных. Разделите свои «теги» на отдельный детский стол, подобный этому ...

parentID fruitTag 
-------- -------- 
     1 banana 
     1 orange 
     1 apple 

...а затем вы можете использовать равно условий для поиска тегов (через запрос с INNER JOIN между двумя таблицами). Вы также можете индексировать поле [fruitTag] для более быстрого поиска. (Подходы InStr() и LIKE "*tag*" не могут воспользоваться индексацией.)

+0

Спасибо, за иллюстративные примеры. В настоящее время эффективность и скорость не являются моей проблемой, поскольку это пробный проект для меня. Я сохранял входные значения (пользователь может вводить два или более имени фруктов), разделенные пробелами в массиве. Итак, у нас есть запрос, который может проходить через значения массива и производить реброз. То, что я делал, Цитирование по значениям массива, создание перепрограммирования и добавление его в другой набор записей другого поискового запроса, а затем создание окончательного набора записей. Но эта идея кажется довольно плохим. Любое предложение сделать это в разумной манере. – msinfo

+0

@msinfo Если вы рассматриваете цикл в массиве и хотите сохранить теги в одном поле, то вы * можете *: ** (1) ** использовать разделитель без пробелов, который не может отображаться в самом теге («pipe» character '|' является популярным выбором), ** (2) ** использовать * ведущие * AND * трейлинг * разделители (например, '| tag1 | tag2 |'), затем ** (3) ** использовать цикл для создания многочастного предложения WHERE, например 'WHERE (Fruit LIKE" * | tag1 | * ") ИЛИ (Fruit LIKE" * | tag2 | * ")'. –

+0

Эй, спасибо, я понял, с вашей информацией. Теперь я могу сказать, почему мой код был неуклюжим и громоздким. Еще раз спасибо. – msinfo

1

Как это ..

SELECT * FROM table_name WHERE instr(1,fruit,"apple") > 0 
+0

Справа, это сработало. И теперь, как мне обрабатывать несколько входных параметров, например, вместо «яблока» пользователь может искать «яблочный виноград». Если бы это были известные параметры, мы могли бы использовать оператор OR, но нам нужно обрабатывать неизвестные параметры. – msinfo

+1

@msinfo У вас нет возражений против возвращения «ананаса» при поиске «яблока» или «грейпфрута», возвращаемого при поиске «винограда» ...? –

+0

@ Горд Томпсон: Да! Я не хочу этого. Поэтому, если пользователь ищет такие термины, как «apple orange», должны быть созданы только те записи, где столбец FRUIT содержит слова «яблоко» (а не ананас) и «оранжевый» в нем как значения. – msinfo

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