Извлечение второго слова из каждой строки в столбце

0

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

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

SELECT vendor_name
FROM vendors
ORDER BY vendor_name
LIMIT 10

Я получаю вывод ниже Изображение 174551

Моя проблема заключается в том, что я пытаюсь извлечь второе слово из каждого имени 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-запроса Изображение 174551

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

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

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

Спасибо.

Теги:

3 ответа

1
Лучший ответ

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

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

 LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 1
  • 0
    Я взял ваши советы из вашего SQL-запроса, и я нашел решение, в котором я нуждался. Вы можете взглянуть на это и сказать мне, что вы думаете. Спасибо за внимание
1

Я взял советы от бит @stick и @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
1
 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
    Я взял ваши советы из вашего SQL-запроса, и я нашел решение, в котором я нуждался. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню