2010-07-05 2 views
1

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

я использую что-то вроде

SELECT * FROM Tbl 
WHERE NOT EXISTS(
    SELECT * FROM @SearchItems WHERE NOT( 
    name LIKE SItem OR 
    description LIKE SItem OR 
    field3 LIKE SItem) 
) 

Это ищет запись, где не существует searchitems, которые не найдены -> Значит, это только показывает, элементы, где все поисковые теги находятся в любом поле. Я использую эти два «NOT», потому что в противном случае мне нужно было бы проверить, подсчитывается ли количество найденных элементов = количество всех элементов.

Но теперь у меня проблема с датами. Потому что 10/05/05 - это дата, но также может быть числом в описании. Поэтому я хочу получить все элементы, где есть 10/05/05 в одном из нормальных полей, или дата соответствует конкретной дате.

Но если я добавить somehting как

AND NOT EXISTS(
    SELECT * FROM @DateItems WHERE NOT(
    date = DItem) 
) 

Это означает, что пункт должен иметь 10/05/05 в виде строки в поле и в качестве даты, но если я использую ИЛИ, это означает, что все элемент с правильным днем ​​будет отображаться независимо от других ключевых слов. Если я удалю «ключевые слова даты» из «all-keywords», он не найдет строку в описании.

Как это исправить? Я хочу получить все элементы с даты или с датой в описании, когда я вхожу в «10/05/05», но если я введу «синий 10/05/05», синий должен находиться в одном из полей и 10/05/05 может быть в обычном поле ИЛИ дате.

Редактировать: Я забыл упомянуть: в массиве «все ключевые слова» даты находятся в оригинальном формате, например «10/05/05». Ключевые слова, реализованные в виде дат, хранятся в массиве «date-keywords» в формате ISO 2005-05-10. Поэтому я не могу сделать что-то вроде WHERE DItem = date OR description like DItem.

Как это немного сложно описать, пожалуйста, спросите, что-то неясно. Спасибо за любую помощь.

ответ

0

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

Поскольку возможная дата также должна быть обычной строкой поиска, поиск не выполняется, когда эта строка не найдена. Единственное исключение - когда интерпретируемая дата строки соответствует дате элемента (в этом случае представление строки не нужно искать где-нибудь). Но для этого вам нужно знать, к какому ключевому слову «date-keyword» принадлежит строка поиска «все ключевые слова».

Если у вас есть это отношение, можно принять элемент, если найдено строковое представление ИЛИ если дата совпадает.

Итак, теперь я загружаю даты с их строковыми представлениями в таблицу и имею простой ИЛИ отношение между ними: WHERE Date = DateItem OR Field = StrItem.

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