带有参数的SQL搜索,可以是日期,也可以是字符串

时间:2010-07-05 10:14:16

标签: sql search date

我有一个搜索框,您可以在其中输入纯文本。关键字用空格分隔。 我检查每个关键字是否符合日期格式,并将“所有关键字”存储在一个数组中,将“日期关键字”存储在另一个数组中。所有'日期关键字'也都在'所有关键字'数组中,因为我无法分辨它的“唯一”日期,也可能是描述或名称。我搜索了许多字段,如姓名,描述等......

我使用类似

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

这将搜索未找到搜索项的条目 - >意味着,它只显示项目,其中所有搜索项目都可以在任何字段中找到。我使用这两个'NOT',否则我将不得不检查找到的项目的数量=所有项目的数量。

但是现在我对日期有疑问。因为10/05/05是一个日期,但也可能是描述中的数字。所以我想在其中一个普通字段中找到10/05/05的所有项目,或者日期与特定日期匹配。

但如果我添加像

那样的东西
AND NOT EXISTS(
    SELECT * FROM @DateItems WHERE NOT(
    date = DItem)
)

这意味着,该项目需要在字段中将10/05/05作为字符串并且作为日期,但如果我使用OR,则表示将显示具有正确日期的所有项目,而不管其他关键字。如果我从'all-keywords'中删除'date-keywords',它将无法在说明中找到该字符串。

如何解决这个问题?我想从日期中获取所有项目,或者在我输入'10 / 05/05'时获得描述中的日期但是如果我输入'blue 10/05/05',则蓝色必须在其中一个字段中并且10 / 05/05可能在正常的领域或日期。

编辑:我忘了提及:在'all-keywords'数组中,日期的格式为'10 / 05/05'。作为日期实现的关键字以ISO格式'2005-05-10'存储在'date-keywords'数组中。所以我不能做像WHERE DItem = date OR description like DItem这样的事情。

由于这有点难以描述,请询问是否有任何不清楚的地方。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。因为我花了很长时间来解决这个问题,所以我会在这里写下来,所以有人可能会从中得到帮助。

由于可能的日期也应该是常规搜索字符串,因此在找不到此字符串时搜索将失败。唯一的例外是当字符串的解释日期与项目的日期匹配时(在这种情况下,不需要在某处找到字符串表示)。但要做到这一点,你需要知道哪个'date-keyword'属于哪个'all-keywords'搜索字符串。

如果你有这种关系,如果找到了字符串表示,或者日期匹配,就可以接受一个项目。

所以现在我将带有字符串表示的日期加载到一个表中并且有一个简单的 或者他们之间的关系:WHERE Date = DateItem OR Field = StrItem