Sql WHERE语句,读取分隔字段
下面的查询以逗号分隔的格式返回我的类别列Sql WHERE语句,读取分隔字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,下面的查询以逗号分隔的格式返回我的类别列 SELECT * FROM ( SELECT l.LID, Company, Doors, City, Region, Country, Categories = STUFF(( SELECT CONVERT(varchar(100), Junc_CatID) +
SELECT *
FROM (
SELECT
l.LID,
Company,
Doors,
City,
Region,
Country,
Categories = STUFF((
SELECT
CONVERT(varchar(100), Junc_CatID) + ', '
FROM BND_ListingJunction_testing j
WHERE j.Junc_LID = l.LID
FOR XML PATH('')), 1, 2, '')
FROM BND_Listing_testing l
GROUP BY
LID, Company, Doors, City, Region, Country
) x
WHERE
x.Categories = CONVERT(VARCHAR(50),2)
如何让where语句查看类别列并确定它是否应显示在not上。这意味着不要将我的类别列中的内容视为一个长字符串,而是将其视为单个实体
如果我的数据集是:
LID Company Doors City Region Country Categories
1 a a a AL US 1,6,8,
2 b b b AZ US 2,6,
3 c c c IA US 8,40,28,30,
我的WHERE子句看的是第8类,那么我的结果是
LID Company Doors City Region Country Categories
1 a a a AL US 1,6,8,
3 c c c IA US 8,40,28,30,
LID Company Doors City Region Country Categories
1 a a a AL US 1,6,8,
2 b b b AZ US 2,6,
如果是6,那么我的结果是
LID Company Doors City Region Country Categories
1 a a a AL US 1,6,8,
3 c c c IA US 8,40,28,30,
LID Company Doors City Region Country Categories
1 a a a AL US 1,6,8,
2 b b b AZ US 2,6,
等等。在您的类别前添加“,”如“,”1,2,6,8”,这样您就可以轻松使用
where ',' + categories like '%,6,%'
您忘记发布部分查询。您需要的WHERE子句将添加到您忘记的部分 在WHERE子句中,您将通过检查categories表上的子查询来确定是否显示该行,如下面两行所示:
SELECT *
FROM (
SELECT
l.LID,
Company,
Doors,
City,
Region,
Country,
Categories = STUFF((
SELECT
CONVERT(varchar(100), Junc_CatID) + ', '
FROM BND_ListingJunction_testing j
WHERE j.Junc_LID = l.LID
FOR XML PATH('')), 1, 2, '')
FROM BND_Listing_testing l
GROUP BY LID, Company, Doors, City, Region, Country
FROM WhateverThisTableIsCalled l
WHERE LID IN (SELECT LID from BND_ListingJunction_testing WHERE Junc_CATID = @TheIdOfInterest)
) x
在你的比较中,你正在检查精确的相等性,这可能是你永远也得不到的
x.Categories = CONVERT(VARCHAR(50),2)
-- becomes this when evaluated
x.Categories = '2'
相反,你想要的是类似于你的类别的东西,或者类似于这样的东西
x.Categories LIKE '%,' + CONVERT(VARCHAR(50), 2) + ',%'
在你的分类列表前面加上Tony的额外逗号。额外的逗号用于防止“6”与“2,26,86”匹配。如果您使用的是compat level 130,字符串分割将起作用:
where '6' in (select value from string_split(Categories, ','))
或者,如果可以使用前导和尾随构建数据,则可以使用
where Categories like `%,6,%`
然而,csv对于这样的查询通常不是一个好主意。规范化查询会更好。只需连接回表以测试是否存在 这将找到所有的6
SELECT *
FROM (
SELECT
l.LID,
Company,
Doors,
City,
Region,
Country,
Categories = STUFF((
SELECT
CONVERT(varchar(100), Junc_CatID) + ', '
FROM BND_ListingJunction_testing j
WHERE j.Junc_LID = l.LID
FOR XML PATH('')), 1, 2, '')
FROM BND_Listing_testing l
GROUP BY
LID, Company, Doors, City, Region, Country
) x
JOIN BND_ListingJunction_testing j ON (j.Junc_LID, Junc_CatID) = (x.LID, 6)
或者更容易理解
SELECT *
FROM (
SELECT
l.LID,
Company,
Doors,
City,
Region,
Country,
Categories = STUFF((
SELECT
CONVERT(varchar(100), Junc_CatID) + ', '
FROM BND_ListingJunction_testing j
WHERE j.Junc_LID = l.LID
FOR XML PATH('')), 1, 2, '')
FROM BND_Listing_testing l
GROUP BY
LID, Company, Doors, City, Region, Country
) X
WHERE EXISTS
(SELECT 1 FROM BND_ListingJunction_testing j
WHERE j.Junc_LID = x.LID and Junc_CatID = 6)
为什么不在连接之前进行过滤呢?我的问题是,如果我在连接之前进行过滤,我使用此查询的网站上的网格将显示任何重复的LID X数量,它在我的连接表中被分类的次数。如果对X公司进行了10次分类,结果显示X公司10次。我只想显示一次,还可以通过where语句进行筛选。永远不要在列中存储csv数据。@JoelCoehoorn我不是在存储csv数据,我是从连接表中提取数据,然后通过XML从select语句中显示数据。在执行填充之前是否进行比较如果我的“类别”列包含类似于1,2,6,8的字符串,在我经过的地方,2,它会显示那一行吗?我已经测试过了,它必须匹配整个字符串。是的,它将显示该行的用法,如“%”,6,“%”@tony Dong谢谢tony的回答,它帮助我工作了!不幸的是,如果我正确的话,我使用的2014不包括字符串拆分功能?@AlexP是的,你是正确的,字符串拆分可能是2016 SP Something Yea:我需要升级,这让我非常紧张。@AlexP好的,在这种情况下,我通常不会推荐它——除非您知道数据非常小。不过,我同意另一种方法,即从字符串中选择值的where table.Column_split@parameter,,,,“这应该比我的例子中的加入慢得多。谢谢你的推荐,让它工作吧!现在我只需要弄清楚如何为城市、州和国家添加额外的过滤器。再次感谢。@AlexP-如果你关心性能,我的答案会更好。@Hogan我会在最初尝试时再次尝试你的答案,可能是我遗漏了什么。我现在将重新访问它。我的下一个大任务是清理excel 1by1中的10k条记录,以获取正确信息:|感谢您的帮助!我会仔细分析一下,看看能不能让它工作。