TSQL 在填充的逗号分隔字符串中查找数据

TSQL Finding Data in a Stuffed comma separated string

我有一个无论如何都不太好的查询。它非常动态,并且由于它在我的应用程序中的用例而成为它的方式。简而言之,它允许用户选择他们想要在报告中看到的字段,以及定义逻辑(WHERE 子句)和最后他们想要排序的顺序。

为了使这更容易,我创建了一个可以包含在报告中的所有数据的视图。这样,它只是选择用户想要的字段并查询视图。

我现在有 运行 个实例,其中我有一些 1:many 情况,而不是只有单个数据点。一个例子是受影响国家的列表。在我看来,它是一个逗号分隔的列表United States, United Kingdom, Etc。此数据只是在视图创建中填充并以逗号分隔。

问题

创建这个时,我打算只对数据使用 IN 语句。然后我意识到 IN 只是一个 table 函数,不能用于一串数据。

有没有办法获取一个值并将其与逗号分隔的数据字符串进行比较?

我正在尝试创建一个 SQL Fiddle,但网站总是崩溃。

CREATE TABLE Test (country varchar(100), account INT);
INSERT INTO Test ('United States, United Kingdom', '123');
INSERT INTO Test ('United States', '123567');
INSERT INTO Test ('United States, China, Japan', '123567');

-- Trying to find all the rows where `United States` is in the country column.

我曾尝试使用 LIKE %country%,但这与 IN 的功能不同,因为如果该国家/地区的一部分位于另一个国家/地区名称中,我将取回不需要的数据。

是否可以创建任何类型的函数作为 IN 语句,我可以在其中根据逗号分隔的字符串测试值?

你可以这样做:

SELECT * FROM Test
WHERE ' ' + country + ',' LIKE '% United States,%'

这将避免返回包含其他国家/地区名称的国家/地区。

正如@BenJaspers 所提到的,爱尔兰和北爱尔兰将是一个例外,因此您可以这样做:

SELECT * FROM Test
WHERE ',' + country + ',' LIKE '%, United States,%'
   OR ',' + country + ',' LIKE '%,United States,%'

这样试试:

CREATE TABLE #Test (country varchar(100), account INT);
INSERT INTO #Test VALUES('United States, United Kingdom', '123');
INSERT INTO #Test VALUES('United States', '123567');
INSERT INTO #Test VALUES('United States, China, Japan', '123567');
INSERT INTO #Test VALUES('Ireland, United States, Japan', '123567');
INSERT INTO #Test VALUES('Northern Ireland, China, Japan', '123567');

DECLARE @SearchCountry VARCHAR(100)='Ireland';

WITH MyCTE AS
(
    SELECT account 
          ,country
          --The string will be splitted at its commas and is returned as XML in parts
          ,CAST('<x>' + REPLACE(country,', ','</x><x>') + '</x>' AS XML) AS CountrySplitted
    FROM #Test
)

SELECT * 
FROM MyCTE
--the first part of the xml is evaluated (may be with LIKE too)
WHERE CountrySplitted.exist('/x[text()=sql:variable("@SearchCountry")]')=1

DROP TABLE #Test;