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;
我有一个无论如何都不太好的查询。它非常动态,并且由于它在我的应用程序中的用例而成为它的方式。简而言之,它允许用户选择他们想要在报告中看到的字段,以及定义逻辑(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;