4

У меня есть запрос, который не является каким-либо образом. Это довольно динамично, и так оно и есть из-за использования в моем приложении. Короче говоря, он позволяет пользователю выбирать поля, которые они хотят видеть в отчете, вместе с определением логики (предложение WHERE) и, наконец, какой порядок они хотят сортировать.TSQL Поиск данных в заполненной запятой строке

Чтобы сделать это проще, я создал представление всех данных, которые можно было включить в отчет. Таким образом, он просто выбирает поля, которые хочет пользователь, и запрашивает представление.

Я столкнулся с экземпляром, где вместо отдельных точек данных у меня есть некоторые ситуации 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

Я отредактировал мой ответ, чтобы отразить поведение больше похоже на 'IN-clause'. Ваша «Ирландия» и «Северная Ирландия» будут обрабатываться правильно ... – Shnugo

ответ

4

Вы можете сделать что-то вроде этого:

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

Это позволит избежать возвращения стран, содержащие другое название страны в них.

Как отметил @BenJaspers, Ирландия и Северная Ирландия будет исключение, так что вы можете сделать это:

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

Это работает только частично. Если мы возьмем Ирландию и Северную Ирландию, то поиск Ирландии по-прежнему возвращает оба. Вы должны проверить, нет ли какой-либо запятой или ничего перед строкой 'LIKE 'United States,%' OR LIKE '%, United States,%'' –

+0

@BenJaspers. Вы правы, не могли придумать пример в моем голова, чтобы проверить все исключения :) – sagi

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; 
+0

Это может помочь мне приблизиться. Вместо переменной, как я могу выполнить поиск по значению в следующей строке? 'sql: variable (" @ SearchCountry ")' – SBB

+0

@SBB Просто замените это на «Ваше значение» (двойные кавычки) – Shnugo

+0

Я попробовал, дал мне ошибку о SQL-варсах, нуждающихся в знаке @. Я только что снял sql: переменную и использованный текст() = «My Value» – SBB

Смежные вопросы