Использование Where IN с STRING_SPLIT и совокупного числа в SQL Server 2016 - PullRequest
1 голос
/ 25 сентября 2019

У меня есть простой оператор Select:

SELECT TOP (100) PERCENT 
    COUNT(*) AS AuthorCount, PMID, dbid
FROM  
    dbo.[Publication.PubMed.Author]
GROUP BY 
    PMID, dbid
HAVING 
    (dbid = 500) AND (COUNT(*) > 1)
ORDER BY 
    PMID

Этот оператор возвращает все строки с AuthorCount.Я хотел бы отфильтровать его только с записями с номером PMID в строке, разделенной запятыми

, например, добавив

WHERE CAST(PMID AS NVARCHAR(15)) IN STRING_SPLIT('28049775,28864564,28049810,27921451,29043651,30001498,27702896,27897198',',')

Я смотрел на C. Агрегирование по значениямв https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017, но это не помогло

Я хотел бы закончить только подмножеством строк, которое находится в строке через запятую.

Спасибо

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете использовать следующий прием, который позволяет искать значение столбца по списку, разделенному запятыми, используя LIKE:

WHERE (',' + '28049775,28864564,28049810,27921451,29043651,30001498,27702896,27897198' + ',') 
    LIKE '%,' + CAST(PMID AS NVARCHAR(15)) + ',%'

Другие примечания по вашему запросу: условие dbid = 500 не относится кагрегатная функция, поэтому она лучше вписывается в предложение WHERE, чем в предложение HAVING.

SELECT TOP (100) PERCENT COUNT(*) AS AuthorCount, PMID, dbid
FROM  dbo.[Publication.PubMed.Author]
WHERE 
    dbid = 500
    AND (',' + '28049775,28864564,28049810,27921451,29043651,30001498,27702896,27897198' + ',') 
        LIKE '%,' + CAST(PMID AS NVARCHAR(15)) + ',%'
GROUP BY PMID, dbid
HAVING COUNT(*) > 1
ORDER BY PMID
...