所以我有一个参数。让我们说:
@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'
但它知道在哪里停下来?知道是否只有一个单词?还是两个?还是三个?
工作流:
有人点击标记,数据集会被该标记过滤。他们点击另一个标签,标签将附加到搜索框中,然后数据集将被这两个标签等过滤。
谢谢!
更新
这是基于产品的情况。
因此,在Product表中,我有一个字段,它们用字符串分隔,以便在应用程序端显示,并且这些相同的标记也可以在ProductTag表中找到,并根据ProductID分隔行。
我不理解的是,如果该产品中存在搜索中的所有标签,如何将条件放在提供结果的选择中。
我认为使用逗号分隔字段会更容易,但也许我应该使用相应的表格(ProductTags)
答案 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