У меня есть таблица vendors
в моей базе данных, где я экспериментирую, как показано ниже
И когда я запустил команду sql ниже
SELECT vendor_name
FROM vendors
ORDER BY vendor_name
LIMIT 10
Я получаю вывод ниже
Моя проблема заключается в том, что я пытаюсь извлечь второе слово из каждого имени 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-запроса
Если вы заметили вышеприведенный вывод, когда слова в имени vendor_name
больше двух, оно возвращает второе слово просто отлично, и когда имя vendor_name
содержит одно слово, оно возвращает пустую ячейку, как ожидалось.
Проблема возникает, когда vendor_name
содержит ровно два слова, вместо того, чтобы возвращать второе слово, оно возвращает пустую ячейку, например, в случае с vendor_name
American Express
и ASC Signs
.
Как я могу улучшить мой запрос, так что даже когда имя vendor_name
содержит два слова, оно возвращает второе слово вместо пустой ячейки?
Спасибо.
Это потому, что после второго слова нет места, если текст заканчивается там, locate()
не имеет места для поиска.
Быстрый взлом: добавьте пробел в конец.
LOCATE( ' ', CONCAT(SUBSTRING( vendor_name, LOCATE(' ', vendor_name) + 1), ' ') ) - 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
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 ;