我的查询无论如何都不是很漂亮。它非常动态,是由于它在我的应用程序中的用例。简而言之,它允许用户选择他们想要在报表上看到的字段,以及定义逻辑(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
语句,我可以根据逗号分隔的字符串测试值?
答案 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;