2013-07-02 2 views
1

У меня есть одна таблица, в которой я пытаюсь запустить SQL-запрос (классический ASP). Таблица построена следующим образом:.ASP SQL Поиск одной строки в нескольких столбцах одной таблицы

ID Name City  State Zip  Country 
1 Name1 Los Angeles CA  90210 USA 
2 Miami New York NY  10011 USA 
3 Name3 Miami  FL  33184 USA 

Я хотел бы быть в состоянии выполнить запрос, который искали несколько столбцов (например, «Miami, FL) и возвращает правильные результаты

поиск приходит в Name=SearchTerm, и мой текущий запрос SQL является:

fp_sQry="SELECT * FROM tableName WHERE ((Shiur = '2') or (Shiur IS NULL)) AND ((City LIKE '::Name::%') or (State LIKE '%::Name::') or (Name LIKE '%::Name::%') or (Zip LIKE '%::Name::%') or (Country LIKE '%::Name::%')) AND (Nusach LIKE '%::Nusach::%') ORDER BY Name ASC" 

Как она стоит, я только в состоянии запустить поиск по одной колонке, так Name=Miami фактически выполняет поиск всех столбцов и возвращает все соответствующие результаты, в то время как Name=Miami, + FL или Name=Miami+FL возвращает 0 результатов.

Любые идеи о том, как настроить мой запрос на соответствие нескольким частям запроса в нескольких столбцах?

ответ

3

Похоже на то, что вы пытаетесь выполнить полнотекстовый поиск на бэкэнд, который не поддерживает полнотекстовый поиск. Вероятно, вам лучше переключиться с Access на SQL Server. IIRC даже Express Edition поддерживает full-text search в эти дни.

О доступе вы можете эмулировать вид полнотекстового поиска, изменив запрос так:

SELECT * 
FROM tableName 
WHERE (Shiur = '2' OR Shiur IS NULL) 
    AND City + State + Name + Zip + Country LIKE '%::Name::%' 
    AND Nusach LIKE '%::Nusach::%' 
ORDER BY Name ASC 

Обратите внимание, что все сцепленные поля (City + State + Name + Zip + Country) должны быть одного и того же типа данных.

Однако даже при этом вам все равно придется проанализировать вашу строку ввода и изменить запрос, если вы хотите найти более одного срока. Для примера ввода Miami+FL вам нужно разделить эту строку:

inputString = "Miami+FL" 
searchTerms = Split(inputString, "+") 

изменить запрос на что-то вроде этого:

SELECT * 
FROM tableName 
WHERE (Shiur = '2' OR Shiur IS NULL) 
    AND City + State + Name + Zip + Country LIKE '%::param1::%' 
    AND City + State + Name + Zip + Country LIKE '%::param2::%' 
    AND Nusach LIKE '%::Nusach::%' 
ORDER BY Name ASC 

и передать searchTerms(0) и searchTerms(1) как 2 parameters к запросу.

+0

Этот ответ помог прояснить несколько вещей, благодаря кучке! Все еще не работает, с 'DIM searchTerm, inputSplit searchTerm = Request.querystring (" Name ") inputSplit = Split (searchTerm,", ")' и 'fp_sQry =" SELECT * FROM tblShuls WHERE ((Shiur = '2') или (Shiur IS NULL)) И City + State + Name + Zip + Country LIKE '% :: response.write searchTerm ::%' или (City = ':: City ::') или (Страна = ':: Страна: : ') AND (Nusach LIKE'% :: Nusach ::% ') ORDER BY Name ASC "' В итоге я возвращаю результаты со всеми записями в моей базе данных, поэтому они, очевидно, все претендуют на этот очень открытый шаблон. –

+0

Я не думаю, что 'response.write searchTerm' принадлежит. Тем не менее, вы должны использовать параметризованные запросы в любом случае (см. Последнюю ссылку в моем ответе или ответы на [этот вопрос] (http://stackoverflow.com/q/1092512/1630171)). –

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