Получить все символы перед пробелом в MySQL

81

Я бы хотел поставить все символы в поле перед пробелом

Например, если field1 есть"chara ters"

Я хочу вернуть "chara"

Как бы выглядел этот оператор выбора?

Алекс Гордон
источник

Ответы:

115

SELECT LEFT(field1,LOCATE(' ',field1) - 1)

Обратите внимание: если рассматриваемая строка не содержит пробелов, возвращается пустая строка.

Mchl
источник
6
Он возвращает chara с пробелом в конце. Вам нужно уменьшить результат LOCATE, если в конце не нужен разделитель: SELECT LEFT (field1, LOCATE ('', field1) - 1)
Enyby
1
Это не сработает, если ваше основное поле не содержит пробела. Подстрока вернет пустое значение, а не целую строку. Например, если мое поле содержит строку «тест-возможное-неверное-имя», подстрока ничего не вернет вместо «тест-возможное-неверное-имя».
Swapnil Gangrade
2
@SwapnilGangrade В зависимости от фактического использования может ожидаться поведение или нет. Кто-то может возразить, что если в строке нет пробела, значит, перед пробелом нет символов, и поэтому должна быть возвращена пустая строка. В этом случае другой человек может захотеть вернуть целую строку. Вопрос не указывает, как функция должна вести себя в этом пограничном случае. Я обновлю ответ, чтобы выделить его.
Mchl
11
Тогда select SUBSTRING_INDEX( field1, ' ', 1 ) from table;будет выбор, если мы хотим иметь полную строку, если нет места.
Swapnil Gangrade
2
Ответ ниже ( SUBSTRING_INDEX) «лучше» в качестве общего решения, потому что он будет сохранять значения, не содержащие разделителя, вместо того, чтобы давать пустое значение.
дегенерат
88

Ниже приведен еще один метод, который работает и некоторым может показаться немного более простым. Он использует функцию MySQL SUBSTRING_INDEX . 1 возвращает все до первого пробела, а -1 возвращает все после последнего пробела.

Это возвращает chara:

SELECT SUBSTRING_INDEX( field1, ' ', 1 )

Это возвращает 'ters':

SELECT SUBSTRING_INDEX( field1, ' ', -1 )

Детали

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

В этом случае -2 вернет все, что находится справа от предпоследнего пробела, чего нет в этом примере, поэтому будет возвращено все значение поля.

Т. Брайан Джонс
источник
3
Это также работает, если есть строки без пробела, например, chara также будет работать.
Bernhardh
2
Это отлично сработало при получении основной + второстепенной версии строки версии с компонентами xyz.
thomthom
4
Это лучше всего работает, когда вы хотите вернуть все поле, если не удалось найти символ.
stephentgrammer
Я использую это для извлечения географических координат из строкового поля, где гарантированно существует разделитель (запятая).
ob-ivan
11

Для этого вам понадобятся некоторые строковые операции . Предполагая, что в каждом поле есть хотя бы один пробел:

SELECT SUBSTR(field1, 0, LOCATE(' ', field1)) FROM your_table;

Безопасный подход:

SELECT IF(
    LOCATE(' ', field1),
    SUBSTR(field1, 0, LOCATE(' ', field1)),
    field1
) FROM your_table;
слияние душ
источник
+1 для безопасной версии, хотя непонятно, какой результат должен быть возвращен, если поле не содержит пробела.
Mchl
2
пришлось поменять 0 на 1:SELECT SUBSTR(field1, 1, LOCATE(' ', field1)) FROM your_table;
Lluís