Извлечение второго слова из каждой строки в столбце - PullRequest
0 голосов
/ 25 июня 2018

У меня есть таблица vendors в моей базе данных, с которой я экспериментирую, как показано ниже enter image description here

И когда я запускаю команду sql ниже

SELECT vendor_name
FROM vendors
ORDER BY vendor_name
LIMIT 10

Я получаю вывод ниже enter image description here

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

И ниже приведен SQL-запрос, который я написал, чтобы сделать это

SELECT vendor_name,
       SUBSTRING(
           SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1),
           1,
           LOCATE( ' ', SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1) ) - 1
       ) AS second_word
FROM vendors
ORDER BY vendor_name
LIMIT 10

А вот выходные данные этого SQL-запроса enter image description here

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

Проблема возникает, когда vendor_name содержит ровно два слова, вместо возврата второго слова, он возвращает пустую ячейку, например, в случае American Express и ASC Signs.

Как мне улучшить мой запрос, чтобы даже когда vendor_name содержал дваo слова, оно возвращает второе слово вместо пустой ячейки?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 июня 2018
 SELECT vendor_name  , substr(vendor_name , instr(vendor_name, " ") ,
 case when LOCATE (' ', vendor_name,instr(vendor_name, " ") ) > 0 then  LOCATE (' ', 
vendor_name,instr(vendor_name, " ") ) else CHAR_LENGTH (vendor_name) end )
  from vendors ;
0 голосов
/ 25 июня 2018

Я взял советы от @stick bit и @kiran gadhe, и я придумал этот sql-запрос, и он работает просто отлично

SELECT vendor_name,
       CASE
           WHEN INSTR( vendor_name, ' ' ) = 0
           THEN
               ''
           ELSE
               SUBSTRING(
                   SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1),
                   1,
                   LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 1
               )
       END AS second_word
FROM vendors
ORDER BY vendor_name
LIMIT 10
0 голосов
/ 25 июня 2018

Это потому, что после второго слова нет пробела, если текст на этом заканчивается, у locate() нет места для поиска.

Быстрый взлом: добавьте пробел в конце.

 LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...