我需要在每个单词上使用逗号分隔的字符串来表示SQL和条件

时间:2013-08-25 21:27:37

标签: sql sql-server relational-division

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

@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)的单独表格中
  3. 因此,在Product表中,我有一个字段,它们用字符串分隔,以便在应用程序端显示,并且这些相同的标记也可以在ProductTag表中找到,并根据ProductID分隔行。

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

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

3 个答案:

答案 0 :(得分: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表理想情况下是直接从您的应用程序传递的表值参数,但也可以通过对逗号分隔参数使用拆分函数来填充。

答案 1 :(得分: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会导致双逗号附加到与'%,,%'匹配的代码字段。

答案 2 :(得分:0)

来自codeproject:

-- =============================================
-- 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