3

所以我有一个参数。让我们说:

@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'

但它知道在哪里停下来吗?知道只有一个字吗?还是两个?还是三个?

工作流程:

有人单击一个标签,数据集就会按该标签过滤。他们单击另一个,标签被附加到搜索框,然后数据集被这两个标签过滤,等等。

谢谢!

更新:

这是基于产品的情况。

  1. 创建产品时,创建者可以输入以逗号分隔的搜索标签。
  2. 插入产品时,搜索标签会插入到名为 ProductTags (ProductID, TagID) 的单独表中

因此,在 Product 表中,我有一个字段,它们由字符串分隔,以便在应用程序端显示,并且这些相同的标签也可以在 ProductTag 表中找到,基于 ProductID 由行分隔。

我不明白的是,如果搜索中的所有标签都存在于该产品,如何将条件放在提供结果的选择中。

我认为只使用逗号分隔的字段会更容易,但也许我应该使用相应的表(ProductTags)

4

3 回答 3

2

ProductTags使用该表的一种关系划分方法是

DECLARE @TagsToSearch TABLE (
  TagId VARCHAR(50) PRIMARY KEY )

INSERT INTO @TagsToSearch
VALUES      ('Red'),
            ('Large'),
            ('New')

SELECT PT.ProductID
FROM   ProductTags PT
       JOIN @TagsToSearch TS
         ON TS.TagId = PT.TagId
GROUP  BY PT.ProductID
HAVING COUNT(*) = (SELECT COUNT(*)
                   FROM   @TagsToSearch) 

理想情况下,该@TagsToSearch表将是直接从您的应用程序传递的表值参数,但也可以通过对您的逗号分隔参数使用拆分函数来填充。

于 2013-08-25T22:03:53.503 回答
1

您只需要添加通配符:

SELECT * 
FROM MyTable 
WHERE    ','+Tags+',' LIKE '%,FirstWordInString,%'
     AND ','+Tags+','Like '%,SecondWordInString,%'
     AND ','+Tags+','Like '%,ThirdWordInString,%'

更新:我现在明白问题是你有一个变量你试图匹配标签。该变量具有标签的字符串列表。如果您使用拆分字符串函数拆分用户选择的标签列表,或者可以单独从输入表单中获取用户选择的标签,那么您可以使用:

SELECT *
FROM MyTable
WHERE ',,'+Tags+',' LIKE '%,'+@tag1+',%'
         AND ',,'+Tags+',' LIKE '%,'+@tag2+',%'
         AND ',,'+Tags+',' LIKE '%,'+@tag3+',%'
         AND ',,'+Tags+',' LIKE '%,'+@tag4+',%'

等等

这将适用于任意数量的输入标签,因为空@tag会导致在标签字段匹配时附加双逗号'%,,%'

于 2013-08-25T21:30:40.460 回答
0

来自代码项目:

-- =============================================
-- Author: Md. Marufuzzaman
-- Create date: 
-- Description: Split an expression. 
-- Note: If you are using SQL Server 2000, You need to change the 
-- length (MAX) to your maximum expression length of each datatype.
-- =============================================
/*
SELECT * FROM [dbo].[SPLIT] (';','I love codeProject;!!!;Your development resources')
*/
CREATE FUNCTION [dbo].[SPLIT] 
(  @DELIMITER VARCHAR(5), 
  @LIST      VARCHAR(MAX) 
 ) 
   RETURNS @TABLEOFVALUES TABLE 
  (  ROWID   SMALLINT IDENTITY(1,1), 
     [VALUE] VARCHAR(MAX) 
  ) 
AS 
BEGIN

  DECLARE @LENSTRING INT 

  WHILE LEN( @LIST ) > 0 
     BEGIN 

        SELECT @LENSTRING = 
           (CASE CHARINDEX( @DELIMITER, @LIST ) 
               WHEN 0 THEN LEN( @LIST ) 
               ELSE ( CHARINDEX( @DELIMITER, @LIST ) -1 )
            END
           ) 

        INSERT INTO @TABLEOFVALUES 
           SELECT SUBSTRING( @LIST, 1, @LENSTRING )

        SELECT @LIST = 
           (CASE ( LEN( @LIST ) - @LENSTRING ) 
               WHEN 0 THEN '' 
               ELSE RIGHT( @LIST, LEN( @LIST ) - @LENSTRING - 1 ) 
            END
           ) 
     END

  RETURN 

END

http://www.codeproject.com/Articles/38843/An-Easy-But-Effective-Way-to-Split-a-String-using

于 2013-08-25T21:33:28.183 回答