【发布时间】:2013-08-25 21:27:36
【问题描述】:
所以我有一个参数。让我们说:
@Tags = 'Red,Large,New'
我的表中有一个名为 [Tags] 的字段
让我们说一个特定的行,该字段包含“Red,Large,New,SomethingElse,AndSomethingElse”
我怎样才能将其分解以基本上实现以下逻辑,我将输入以理解但我知道是错误的:
SELECT * FROM MyTable WHERE
Tags LIKE 'FirstWordInString'
AND Tags Like 'SecondWordInString'
AND Tags Like 'ThirdWordInString'
但它知道在哪里停下来?知道只有一个字吗?还是两个?还是三个?
工作流程:
有人点击一个标签,数据集就会被该标签过滤。他们点击另一个,标签被附加到搜索框,然后数据集被这两个标签过滤,等等。
谢谢!
更新:
这是基于产品的情况。
- 创建产品时,创建者可以输入以逗号分隔的搜索标签。
- 插入产品时,搜索标签会插入到名为 ProductTags (ProductID, TagID) 的单独表中
所以,在 Product 表中,我有一个字段,它们用字符串分隔,以便在应用程序端显示,并且这些相同的标签也可以在 ProductTag 表中找到,根据 ProductID 按行分隔。
我不明白的是,如果搜索中的所有标签都存在于该产品,如何将条件放在提供结果的选择中。
我认为只使用逗号分隔的字段会更容易,但也许我应该使用相应的表(ProductTags)
【问题讨论】:
-
如果您对数据库进行规范化,这将变得很多更容易并且更快...
-
@Ben - 关系除法查询并没有(如果有的话)更快和更容易使用规范化结构。并不是说我提倡这种设计,只是如果 OP 重新设计数据库并期望查询变得微不足道,他们可能会感到失望。
-
@Ben 更新了我的问题以更清晰。我已经规范化了数据库。
-
我建议您编写一个 SQL 函数,该函数可以(安全地!)动态构造查询,并将标签数组传递给它。
-
这个
ProductTags表。TagId是什么?是Red之类的字符串,还是有另一个名为Tags的表?
标签: sql sql-server relational-division