Как я могу разделить запятую значение в MySQL на строки? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть функция в MySQL, которая возвращает список целочисленных значений, разделенных запятой, образуя строку.

например,

MyFunction(23);

Возвращает

----------------------
|  MyFunction(23)    |
|--------------------|
|  34,45,87,23,1     |
----------------------

Это была простая функциональность, необходимая для бэкэнда (Java) - но теперь, когда предлагаются новые функции, мне нужны эти результаты для другого запроса, который может повторяться по ним с использованием ключевого слова IN , например, следующего:

SELECT id, myItemId, myItemValue, myDateTime 
FROM 
items where id 
IN (select MAX(id) from items where myItemId=1  
    and myItemValue 
    IN (select MyFunction(123)) 
group by myItemId);

Будучи единственным элементом csv, результат MyFunction (23) не повторяется.Если бы я мог использовать какую-то функцию, такую ​​как Split(MyFunction(23)), которая выдала бы результаты, подобные приведенным ниже, я бы идеально подошел к моим запросам без особых изменений.

Вот результаты, которые я ожидаю:

-----------------------------
|  Split(MyFunction(23))    |
|---------------------------|
|  34                       |
|  45                       |
|  87                       |
|  23                       |
|  1                        |
-----------------------------

Также нужно позаботиться о том, чтобы MyFunction () могла возвращать пустой результат или результат с одним элементом (без запятой).

Есть ли встроенная функция или простая функция, которую я могу создать, чтобы получить то же самое?

Это отличается от других вопросов о стековом потоке, так как мое требование очень простое, а вывод других решений будет излишним.Выглядит что-то похожее на функцию split () или очень простую реализацию.

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать функцию FIND_IN_SET.Например:

SELECT FIND_IN_SET('34', '34,45,87,23,1'); -- return true

SELECT FIND_IN_SET('34', '34'); -- return true    

SELECT FIND_IN_SET('34', ''); -- return false

В вашем случае SQL-запрос будет выглядеть так:

SELECT id,
       myItemId,
       myItemValue,
       myDateTime
FROM items
WHERE id IN
    (SELECT MAX(id)
     FROM items
     WHERE myItemId=1
       AND FIND_IN_SET(myItemValue, MyFunction(123))
     GROUP BY myItemId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...