Так у вас есть поле в вашей таблице, которая может содержать несколько значений, как ...
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*"
не могут воспользоваться индексацией.)
Спасибо, за иллюстративные примеры. В настоящее время эффективность и скорость не являются моей проблемой, поскольку это пробный проект для меня. Я сохранял входные значения (пользователь может вводить два или более имени фруктов), разделенные пробелами в массиве. Итак, у нас есть запрос, который может проходить через значения массива и производить реброз. То, что я делал, Цитирование по значениям массива, создание перепрограммирования и добавление его в другой набор записей другого поискового запроса, а затем создание окончательного набора записей. Но эта идея кажется довольно плохим. Любое предложение сделать это в разумной манере. – msinfo
@msinfo Если вы рассматриваете цикл в массиве и хотите сохранить теги в одном поле, то вы * можете *: ** (1) ** использовать разделитель без пробелов, который не может отображаться в самом теге («pipe» character '|' является популярным выбором), ** (2) ** использовать * ведущие * AND * трейлинг * разделители (например, '| tag1 | tag2 |'), затем ** (3) ** использовать цикл для создания многочастного предложения WHERE, например 'WHERE (Fruit LIKE" * | tag1 | * ") ИЛИ (Fruit LIKE" * | tag2 | * ")'. –
Эй, спасибо, я понял, с вашей информацией. Теперь я могу сказать, почему мой код был неуклюжим и громоздким. Еще раз спасибо. – msinfo