Преобразование строки в список в SQL

У меня есть запрос типа:

SELECT col1,col2 from table1 where col1 in (:var);

И этот :var имеет значение вроде "'1234', '5678'", которое представляет собой строку, состоящую из одинарных кавычек и запятых. Я хочу преобразовать эту строку в тип, который можно указать в качестве входных данных для оператора SQL "in", например:

SELECT col1, col2 from table1 where col1 in (STRING_SPLIT(:var));

Вы не; STRING_SPLIT работает не так. Вам нужно JOIN разделить значение или использовать IN против подзапроса (который использует STRING_SPLIT). В качестве альтернативы переключитесь на параметр типа таблицы, и тогда вам вообще не нужно использовать STRING_SPLIT.

Larnu 17.02.2023 12:01
DECLARE @var AS NVARCHAR(100) = '''1234'', ''5678'''; SELECT col1, col2 FROM table1 WHERE col1 IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@var, ','))
NIKUNJ PATEL 17.02.2023 12:02

Как эта ссылка помогает stackoverflow.com/questions/10914576/t-sql-split-string

Igor Micev 17.02.2023 12:03

@NIKUNJPATEL Огромное спасибо, ты спас меня !!!!. Пожалуйста, добавьте свое решение в качестве ответа.

Sufi 17.02.2023 12:13

@Sufi Ответ добавлен.

NIKUNJ PATEL 17.02.2023 12:15
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете использовать STRING_SPLIT для расширения литеральной строки с разделителями в несколько строк литералов с разделителями. STRING_SPLIT('abc,def',',') не приводит к 'abc','def', он приводит к набору данных из 2 строк, содержащих значения 'abc' и 'def'.

Если вы хотите передать строку с разделителями, вам нужно либо JOIN/CROSS APPLY на STRING_SPLIT, либо использовать подзапрос:

SELECT T1.Col1,
       T1.Col2
FROM dbo.table1 T1
     JOIN STRING_SPLIT(@YourVariable,',') SS ON T1.Col1 = SS.Value;

SELECT T1.Col1,
       T1.Col2
FROM dbo.table1 T1
WHERE T1.Col1 IN (SELECT SS.Value
                  FROM STRING_SPLIT(@YourVariable,',') SS);

Однако вы можете добиться еще большей производительности с индексированной временной таблицей, если имеете дело с большими наборами данных:

CREATE TABLE #temp (Value varchar(30) PRIMARY KEY); --Use an appropriate data type. I assume unique values in the delimited string

INSERT INTO #temp (Value)
SELECT SS.Value
FROM STRING_SPLIT(@YourVariable,',') SS;

SELECT T1.Col1,
       T1.Col2
FROM dbo.table1 T1
     JOIN #Temp T ON T1.Col1 = T.Value;

Наконец, что может быть лучше, вы можете использовать параметр типа таблицы. Тогда вы, как и выше, просто JOIN к этому или используете EXISTS.

Ответ принят как подходящий

Это код как решение для достижения желаемого результата в запросе SQL-сервера.

DECLARE @var AS NVARCHAR(100) = '''1234'', ''5678'''; 
SELECT col1, col2  FROM table1  WHERE col1 IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@var, ','))

Другие вопросы по теме