Разделить столбец запятой - PullRequest
2 голосов
/ 05 июля 2019

У меня есть таблица с 3 столбцами с данными, приведенными ниже.

ID |  Col1        |         Col2            |   Status
1     8007590006    8002240001,8002170828        I
2     8002170828    8002000004                   I
3     8002000001    8002240001                   I
4     8769879809    8002000001                   I
5     8769879809    8002000001                   I

Col2 может содержать несколько значений, разделенных запятыми. Мне нужно обновить статус до C, если есть значение в col2, которое также присутствует в col1.

Например, для ID = 1, col2 содержит 8002170828, который присутствует в Col1, ID = 2. Итак, статус = 'C'

Из того, что я пробовал, я знаю, что это не сработает, когда есть несколько значений, так как мне нужно разделить эти данные и получить отдельные значения, а затем применить обновление.

UPDATE Table1
SET STATUS = 'C' 
WHERE Col1 IN (SELECT Col2 FROM Table1)

Ответы [ 2 ]

4 голосов
/ 05 июля 2019

Если вы используете SQL Server 2016 или более позднюю версию, тогда вам пригодится STRING_SPLIT:

WITH cte AS (
    SELECT ID, Col1, value AS Col2
    FROM Table1
    CROSS APPLY STRING_SPLIT(Col2, ',')
)

UPDATE t1
SET Status = 'C'
FROM Table1 t1
INNER JOIN cte t2
    ON t1.Col1 = t2.Col2;

enter image description here

Демо

3 голосов
/ 05 июля 2019

Этот ответ предназначен в качестве дополнения к ответу Тима

Поскольку у вас нет собственного разделения строк, которое появилось в 2016 году, мы можем сделать его:

CREATE FUNCTION dbo.STRING_SPLIT
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT y.i.value('(./text())[1]', 'nvarchar(4000)') as value
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
        + REPLACE(@List, @Delimiter, '</i><i>') 
        + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

--credits to sqlserverperfomance.com for the majority of this code - https://sqlperformance.com/2012/07/t-sql-queries/split-strings

Теперь ответ Тима должен сработать для вас, поэтому мне не нужно будет повторять его здесь

Я выбрал подход на основе xml, потому что он работает хорошо, и ваши данные кажутся нормальными и в них не будет никаких символов xml. Если он когда-либо будет содержать xml-символы, такие как>, которые прервут синтаксический анализ, они должны быть экранированы, а затем не экранированы после split

Если вам не разрешено создавать функции, вы можете извлечь все между RETURNS и GO, вставить его в запрос Тима, настроить имена переменных на имена столбцов, и это все равно сработает

...