TSQL以逗号分隔的字符串查找数据

时间:2016-03-14 14:48:31

标签: sql-server tsql stored-procedures sql-server-2012 dynamic-sql

我的查询无论如何都不是很漂亮。它非常动态,是由于它在我的应用程序中的用例。简而言之,它允许用户选择他们想要在报表上看到的字段,以及定义逻辑(WHERE子句)以及他们想要排序的顺序。

为了简化这一过程,我创建了一个可以包含在报告中的所有数据的视图。这样,它只需选择用户想要的字段并查询视图。

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

问题

创建时,我的目的是在数据上使用IN语句。然后我意识到IN只是一个表函数,不能用于一串数据。

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

我试图创建一个SQL小提琴,但网站一直在崩溃。

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语句,我可以根据逗号分隔的字符串测试值?

2 个答案:

答案 0 :(得分:4)

您可以这样做:

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

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

如@BenJaspers所述,爱尔兰和北爱尔兰将是一个例外,所以你可以这样做:

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

答案 1 :(得分:3)

试试这样:

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;