【问题标题】:I need to use a comma delimited string for SQL AND condition on each word我需要为每个单词的 SQL AND 条件使用逗号分隔的字符串
【发布时间】: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'

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

工作流程:

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

谢谢!

更新:

这是基于产品的情况。

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

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

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

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

【问题讨论】:

  • 如果您对数据库进行规范化,这将变得很多更容易并且更快...
  • @Ben - 关系除法查询并没有(如果有的话)更快和更容易使用规范化结构。并不是说我提倡这种设计,只是如果 OP 重新设计数据库并期望查询变得微不足道,他们可能会感到失望。
  • @Ben 更新了我的问题以更清晰。我已经规范化了数据库。
  • 我建议您编写一个 SQL 函数,该函数可以(安全地!)动态构造查询,并将标签数组传递给它。
  • 这个ProductTags 表。 TagId 是什么?是Red 之类的字符串,还是有另一个名为Tags 的表?

标签: sql sql-server relational-division


【解决方案1】:

使用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 表最好是直接从您的应用程序传递的表值参数,但也可以通过对逗号分隔的参数使用拆分函数来填充。

【讨论】:

  • 它肯定比字符串比较方法看起来更干净。
  • 我花了一段时间来适应我遇到的一些独特情况,但这让我走向了成功。非常感谢!
【解决方案2】:

你只需要添加通配符:

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 会导致在匹配'%,,%' 的标签字段中附加双逗号。

【讨论】:

  • 但是如果搜索包含 1 个标签,或者另一个搜索包含 5 个标签怎么办?
  • 相应更新,可能是更好的方法。
【解决方案3】:

来自代码项目:

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

【讨论】:

  • 这对解决核心问题有何帮助? OP想要包含列表的all“部分标签”的所有标签。
  • 更新了我的问题,使问题更加清晰。对于最初的缺失,我深表歉意。
  • 我返回一个包含逗号分隔值的表。您可以在该表中查询您正在搜索的值。
  • @Oscar 你能告诉我如何在我的查询中将此函数与我的条件语句联系起来吗?谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多