#sql #search #date
#sql #Поиск #Дата
Вопрос:
У меня есть окно поиска, в котором вы можете ввести обычный текст. Ключевые слова разделяются пробелами. Я проверяю каждое ключевое слово, соответствует ли оно формату даты, и сохраняю «все ключевые слова» в одном массиве, а «ключевые слова даты» — в другом. Все «ключевые слова даты» также находятся в массиве «все ключевые слова», так как я не могу сказать, является ли это «только» датой или, возможно, также описанием или именем. Я ищу по многим полям, таким как имя, описание и т.д…
Я использую что-то вроде
SELECT * FROM Tbl
WHERE NOT EXISTS(
SELECT * FROM @SearchItems WHERE NOT(
name LIKE SItem OR
description LIKE SItem OR
field3 LIKE SItem)
)
Выполняется поиск записей, в которых не существует элементов поиска, которые не найдены -> Означает, что отображаются только элементы, в которых все элементы поиска найдены в любом поле. Я использую эти два «НЕ», потому что в противном случае мне пришлось бы проверять, соответствует ли количество найденных элементов = количеству всех элементов.
Но теперь у меня проблема с датами. Потому что 10/05/05 — это дата, но также может быть числом в описании. Итак, я хочу получить все элементы, где в одном из обычных полей есть 10/05/05, или дата соответствует конкретной дате.
Но если я добавлю что-то вроде
AND NOT EXISTS(
SELECT * FROM @DateItems WHERE NOT(
date = DItem)
)
Это означает, что элемент должен иметь 10/05/05 в качестве строки в поле И в качестве даты, но если я использую ИЛИ, это означает, что будут показаны все элементы с правильным днем, независимо от других ключевых слов. Если я удалю ‘date-keywords’ из ‘all-keywords’, он не найдет строку в описании.
Как это исправить? Я хочу получить все элементы с датой или с датой в описании, когда я ввожу ’10/05/05′, но если я ввожу ‘синий 10/05/05’, синий должен быть в одном из полей, а 10/05/05 может быть в обычном поле или дате.
Редактировать: я забыл упомянуть: в массиве ‘all-keywords’ даты приведены в исходном формате, например ’10/05/05′. Ключевые слова, реализованные в виде дат, хранятся в массиве ‘date-keywords’ в формате ISO ‘2005-05-10’. Поэтому я не могу сделать что-то вроде WHERE DItem = date OR description like DItem
.
Поскольку это немного сложно описать, пожалуйста, спросите, если что-то неясно. Спасибо за любую помощь.
Ответ №1:
Я нашел решение. И поскольку мне потребовалось много времени, чтобы добраться до этого решения, я запишу его здесь, чтобы кто-нибудь, возможно, получил от него помощь.
Поскольку возможной датой также должна быть обычная строка поиска, поиск завершается неудачей, когда эта строка не найдена. Единственным исключением является случай, когда интерпретируемая дата строки совпадает с датой элемента (в этом случае строковое представление не обязательно где-то искать). Но для этого вам нужно знать, какое ‘ключевое слово date’ принадлежит какой строке поиска ‘all-keywords’.
Если у вас есть это отношение, можно принять элемент, если найдено строковое представление или если дата совпадает.
Итак, теперь я загружаю даты с их строковыми представлениями в таблицу и имею простое отношение OR между ними: WHERE Date = DateItem OR Field = StrItem
.