извлечь первое слово из значений, разделенных запятыми, в SQL [duplicate]

Следует отметить, что были реализованы функции безопасности, которые требуют, чтобы приложение запускалось локально под локальным хостом или через SSL для GetUserMedia () для работы.

Я обнаружил это при попытке нескольких демонстрации доступны и были разочарованы, когда они не работали! См. Новые ограничения безопасности

32
задан Nisse Engström 15 April 2016 в 05:16
поделиться

9 ответов

MYSQL не имеет встроенной функции explode(). Но вы можете легко добавить аналогичную функцию к своей БД, а затем использовать ее из php-запросов. Эта функция будет выглядеть так:

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
       LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
       delim, '');

Использование:

SELECT SPLIT_STRING('apple, pear, melon', ',', 1)

Приведенный выше пример вернет apple. Я думаю, что будет невозможно вернуть массив в MySQL, поэтому вы должны указать, какое из ячеек должно явным образом возвращаться в pos. Дайте мне знать, если вам удастся его использовать.

51
ответ дан Arman P. 16 August 2018 в 05:01
поделиться
  • 1
    Он работал как магия :) спасибо :) – jave.web 19 December 2013 в 17:57
  • 2
    Размер Datatype параметра ограничителя VARCHAR (12) должен быть больше 12, поэтому он не дает непредсказуемых результатов с большими разделителями. – rahmanisback 23 March 2014 в 05:22
  • 3
    Мне нужно объявить эту функцию DETERMINISTIC на одном из моих серверов. Как здесь: ВОЗВРАЩАЕТСЯ ВАРШАР (255) ДЕТЕРМИНИСТИЧЕСКОЕ ВОЗВРАЩЕНИЕ – nerkn 25 April 2014 в 13:57
  • 4
    Как насчет того, кто не знал, сколько позиций? – tfont 12 August 2015 в 12:56
  • 5
    Есть решения, которые возвращают таблицу. Один из них (есть другие): stackoverflow.com/questions/43386709/… – Stoleg 13 April 2017 в 08:25

Как указывал @ arman-p, у MYSQL нет explode (). Однако я считаю, что решение представлено гораздо сложнее, чем нужно. Чтобы выполнить быструю проверку, когда вам задана строка списка с разделителями-запятыми (например, список ключей таблицы для поиска), вы делаете:

SELECT 
    table_key, field_1, field_2, field_3
FROM
    my_table
WHERE
    field_3 = 'my_field_3_value'
    AND (comma_list = table_key
        OR comma_list LIKE CONCAT(table_key, ',%')
        OR comma_list LIKE CONCAT('%,', table_key, ',%')
        OR comma_list LIKE CONCAT('%,', table_key))

Это предполагает, что вам также необходимо проверить поле_3 на стол тоже. Если вам это не нужно, не добавляйте это условие.

2
ответ дан Al Zziwa 16 August 2018 в 05:01
поделиться

Я пытаюсь использовать SUBSTRING_INDEX(string,delimiter,count)

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'

подробнее о mysql.com http://dev.mysql.com/doc/refman/5.1/en/string-functions. HTML # function_substring индекс

32
ответ дан deW1 16 August 2018 в 05:01
поделиться
  • 1
    Это кажется простым и хорошо работает на www.www.www.www.example.com, чтобы перейти на example.com. – ftrotter 21 August 2017 в 10:03

Вы можете использовать хранимую процедуру таким образом.

DELIMITER |

CREATE PROCEDURE explode( pDelim VARCHAR(32), pStr TEXT)                                
BEGIN                                
  DROP TABLE IF EXISTS temp_explode;                                
  CREATE TEMPORARY TABLE temp_explode (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, word VARCHAR(40));                                
  SET @sql := CONCAT('INSERT INTO temp_explode (word) VALUES (', REPLACE(QUOTE(pStr), pDelim, '\'), (\''), ')');                                
  PREPARE myStmt FROM @sql;                                
  EXECUTE myStmt;                                
END |   

DELIMITER ;
  • Пример вызова:
     SET @str  = "The quick brown fox jumped over the lazy dog"; 
     SET @delim = " "; 
    
    CALL explode(@delim,@str);
    SELECT id,word FROM temp_explode;
    
22
ответ дан Disha Goyal 16 August 2018 в 05:01
поделиться
  • 1
    Я не уверен, невероятно ли это невероятно или невероятно опасно. – Dexter 31 July 2013 в 08:00
  • 2
    невероятно блестящий – Stephen Mudere 26 June 2017 в 12:06

Сегодня я столкнулся с такой же проблемой и разрешил ее, как показано ниже. Обратите внимание, что в моем случае я знаю количество элементов в конкатенированной строке, поэтому я могу восстановить их следующим образом:

set @var1=0;
set @var2=0;
SELECT SUBSTRING_INDEX('value1,value2', ',', 1) into @var1;
SELECT SUBSTRING_INDEX('value1,value2', ',', -1) into @var2;

переменные @ var1 и @ var2 будут иметь значения, похожие на explode ().

0
ответ дан DoubleA 16 August 2018 в 05:01
поделиться

Используйте эту функцию. Отлично работает. замените "|" с символом, чтобы взорваться / разбить, а значения 1,2,3 и т. д. основаны на количестве записей в наборе данных: Value_ONE | Value_TWO | Value_THREE.

SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 1), '|', -1) AS PSI,
SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 2), '|', -1) AS GPM,
SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 3), '|', -1) AS LIQUID

Надеюсь, это поможет .

3
ответ дан Nisse Engström 16 August 2018 в 05:01
поделиться
  • 1
    Как вы можете получить количество элементов в наборе? – Lolums 19 June 2016 в 10:36
  • 2
    К сожалению, нет, вам нужно знать количество значений перед рукой. В моем случае я знаю, что мне нужны три значения, и я переименую их PSI, GPM и LIQUID. если одно из значений в наборе данных пуст, SQL возвращает пустое значение без ошибок. Таким образом, я всегда печатаю / эхо $ return- & gt; PSI, $ return- & gt; GPM и $ return- & gt; LIQUID – Sergio Rodriguez 19 June 2016 в 11:06
  • 3
    @Lolums Вы можете подсчитать вхождения разделителя: ROUND ( (CHAR_LENGTH( tblNAME . tblFIELD ) - CHAR_LENGTH(REPLACE ( tblNAME . tblFIELD , "|", "") ) ) / CHAR_LENGTH("|")) Zero = length - это один элемент (без разделителя), One = есть два элемента и т. Д. – FrancescoMM 28 April 2017 в 08:24

, если explode используется вместе с foreach для создания новой строки, вы можете имитировать взрыв, используя цикл while следующим образом:

CREATE FUNCTION explode_and_loop(sep VARCHAR(),inputstring VARCHAR()) RETURNS VARCHAR() 
BEGIN
    DECLARE part,returnstring VARCHAR();
    DECLARE cnt,partsCnt INT();
    SET returnstring = '';
    SET partsCnt = ((LENGTH(inputstring ) - LENGTH(REPLACE(inputstring,sep,''))) DIV LENGTH(sep);
    SET cnt = 0;
    WHILE cnt <= partsCnt DO
        SET cnt = cnt + 1;
        SET part = SUBSTRING_INDEX(SUBSTRING_INDEX(inputstring ,sep,cnt),sep,-1);
        -- DO SOMETHING with the part eg make html:
        SET returnstring = CONCAT(returnstring,'<li>',part,'</li>')
    END WHILE;
    RETURN returnstring;
END

этот пример вернет html-список частей. (требуются переменные legths должны быть добавлены)

0
ответ дан ohjay 16 August 2018 в 05:01
поделиться

use substring_index, в приведенном ниже примере я создал таблицу со столбцом score1 и score2, score1 имеет 3-7, score2 7-3 и т. д., как показано на изображении. Следующий запрос способен разделить с помощью «-» и изменить порядок оценки2 и сравнить с score1

SELECT CONCAT(SUBSTRING_INDEX(score1,'-',1),
SUBSTRING_INDEX(score1,'-',-1)) as my_score1,
CONCAT(SUBSTRING_INDEX(score2,'-',-1),SUBSTRING_INDEX(score2,'-',1)) as my_score2
FROM test HAVING my_score1=my_score2

2
ответ дан philip mudenyo 16 August 2018 в 05:01
поделиться

Прежде всего, вы должны изменить структуру базы данных - оценка в этом случае является некотором составным значением и должна храниться в двух столбцах, например. score_host, score_guest.


MySQL не предоставляет эквивалент explode(), однако в этом случае вы могли бы использовать SUBSTRING() и LOCATE() , чтобы отключить оценку хоста и гостя.

SELECT 
   CONVERT(SUBSTRING(score, 1, LOCATE('-',score) - 2) USING INTEGER) as score_host,
   CONVERT(SUBSTRING(score, LOCATE('-',score)+2) USING INTEGER) as score_guest
FROM ...;

CONVERT() используется для перевода строки "23" в число 23 .

16
ответ дан toraman 16 August 2018 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: