2014-09-17 1 views
0

Я использую приведенный ниже оператор, чтобы вытащить уникальное значение из таблицы из поля, разделенного «|». Это выглядит так: «40 | 180 | 408 | 360 | 40 | 1s66 | 80 | 59» Моя проблема заключается в том, что я не могу заставить этот оператор разрешить мне перенести поле первичного ключа, id и назначить его для каждого уникального элемента из строки поля, чтобы я мог использовать его позже. В идеале идентификатор № 27 должен быть присвоен каждому из значений в этой временной таблице от «40 | 180 | 408 | 360 | 40 | 1s66 | 80 | 59». Может ли кто-нибудь помочь с инструкцией ниже, чтобы я мог вставить и присвоить идентификатор поля этому из таблицы BlogImageBundle?GROUP CONCAT REPLACE sep strings

CREATE TEMPORARY TABLE test (postId INT(11), val CHAR(255)); 
SET @S1 = CONCAT("INSERT INTO test (val) VALUES ('",REPLACE((SELECT GROUP_CONCAT(DISTINCT  `images`) 
AS data FROM `BlogImageBundle`), "|", "'),('"),"');"); 
PREPARE stmt1 FROM @s1; 
EXECUTE stmt1; 
SELECT DISTINCT(val) FROM test; 

ответ

1

Это работает, но ТОЛЬКО для одной записи. Вам нужно будет добавить еще один цикл while, который отслеживает количество строк для обработки нескольких записей: http://sqlfiddle.com/#!6/d62f7/1

CREATE TABLE #Test 
(
    ID   INT, 
    Initial  VARCHAR(MAX) 
) 
CREATE TABLE #Test2 
(
    ID  INT, 
    Final VARCHAR(MAX) 
) 
INSERT INTO #Test VALUES(27,'40|180|408|360|40|1s66|80|59') 

DECLARE @String VARCHAR(MAX) 
SET @string = (SELECT Initial FROM #Test) 

DECLARE @StringInput VARCHAR(MAX) 
SET @stringInput = (SELECT Initial FROM #Test) 
WHILE LEN(@StringInput) > 0 
BEGIN 
    SET @String = LEFT(@StringInput,ISNULL(NULLIF(CHARINDEX('|', @StringInput) - 1, -1),LEN(@StringInput))) 
    SET @StringInput = SUBSTRING(@StringInput,ISNULL(NULLIF(CHARINDEX('|', @StringInput), 0),LEN(@StringInput)) + 1, LEN(@StringInput)) 
    INSERT INTO #Test2 (ID, Final) 
    SELECT ID,@string FROM #Test 
END