mysql разделитель и данные столбца поиска - PullRequest
0 голосов
/ 17 июня 2020

MySQL version = 5.7.29 Я хочу выполнить поиск MySQL в столбце с данными с разделителями. Например:

'field_black: 1, field_white: 2, field1_black: 5, field_green: 3'

Мне нужна функция, которая принимает цвет и возвращает только значения с разделителями, у которых нет входного цвета.

func(input, color, delimiter)
func('field_black:1, field_white:2, field1_black:5, field1_green:3', 'black', ',') = 'field_white:2, field1_green:3'

Это довольно легко реализовать в python, используя разделение строк по разделителю и возвращая набор результатов, когда цвет отсутствует в данном вводе.

def func(inp, col, delim):
    inp = inp.split(delim)

    res = []
    for data in inp:
       if col not in data:
           res.append(data)
    return (','.join(res))

Может ли кто-нибудь помочь мне с эквивалентной реализацией в MySQL. Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 17 июня 2020
CREATE FUNCTION func (input TEXT, color TEXT, delimiter CHAR(1))
RETURNS TEXT 
DETERMINISTIC
BEGIN
DECLARE piece TEXT;
DECLARE result TEXT DEFAULT '';
/* SET color = CONCAT('field_', color); */     /* uncomment if needed */    
    REPEAT
        SET piece = SUBSTRING_INDEX(input, delimiter, 1);
        SET input = SUBSTRING(input FROM 2 + LENGTH(piece) FOR LENGTH(input));
        IF NOT LOCATE(color, piece) THEN
            SET result = CONCAT(result, delimiter, TRIM(piece));
        END IF;
    UNTIL input = ''
    END REPEAT;
    RETURN TRIM(BOTH delimiter FROM result);
END

скрипка

PS. Конечно, при необходимости вы можете использовать разделитель из нескольких символов - просто измените тип входного параметра.

0 голосов
/ 17 июня 2020

Просто взломал это после нескольких итераций из-за незнания синтаксиса MySQL. Однако это излишне сложно.

Ответ Акины более простой и элегантный: mysql разделение и поиск данных столбца

CREATE FUNCTION `new_function`(input longtext, col TEXT, delim CHAR(1)) RETURNS longtext CHARSET utf8
    DETERMINISTIC
BEGIN
declare result longtext  default '';
declare piece longtext  default '';
declare inptext longtext default '';

set inptext = input;

while (substring_index(inptext,delim,1) = '') = 0 DO
    set piece = substring_index(inptext,delim,1);
    IF NOT LOCATE(col, piece) THEN
        set result = concat(result, piece, delim);
    END IF;
    set inptext = substr(inptext, length(SUBSTRING_INDEX(inptext, '|', 1) ) + 2);
END WHILE;


set result = left(result, length(result) -1);
RETURN result;

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...