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条记录,以获取正确信息:|感谢您的帮助!我会仔细分析一下,看看能不能让它工作。