Pobierz wszystkie znaki przed spacją w MySQL

81

Chciałbym, aby wszystkie znaki w polu znajdowały się przed spacją

Na przykład, jeśli field1tak"chara ters"

Chcę, żeby wróciło "chara"

Jak wyglądałoby to wybrane stwierdzenie?

Alex Gordon
źródło

Odpowiedzi:

116

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

Zwróć uwagę, że jeśli dany ciąg nie zawiera spacji, zwróci to pusty ciąg.

Mchl
źródło
6
Zwraca „chara” ze spacją na końcu. Musisz zmniejszyć wynik LOCATE, jeśli nie potrzebujesz separatora na końcu: SELECT LEFT (field1, LOCATE ('', field1) - 1)
Enyby
1
To nie zadziała, jeśli twoje główne pole nie zawiera spacji. Podłańcuch zwróci pustą wartość zamiast zwracać cały ciąg. Np. Jeśli moje pole zawiera ciąg „test-possible-invalid-name”, podciąg nie zwróci nic zamiast „test-possible-invalid-name”.
Swapnil Gangrade
2
@SwapnilGangrade W zależności od rzeczywistego przypadku użycia można oczekiwać zachowania lub nie. Można by argumentować, że jeśli w ciągu nie ma spacji, to nie ma znaków przed spacją, więc należy zwrócić pusty ciąg. Inna osoba może w takim przypadku chcieć zwrócić cały ciąg. Pytanie nie precyzuje, jak funkcja powinna zachowywać się w tym skrajnym przypadku. Zaktualizuję odpowiedź, aby ją podświetlić.
Mchl
11
Wtedy select SUBSTRING_INDEX( field1, ' ', 1 ) from table;będzie wybór, czy chcemy mieć cały ciąg, jeśli nie ma miejsca.
Swapnil Gangrade
2
Odpowiedź poniżej ( SUBSTRING_INDEX) jest „lepsza” jako ogólne rozwiązanie, ponieważ zachowa wartości, które nie zawierają separatora, zamiast skutkować pustą wartością.
zdegenerowany
88

Poniżej znajduje się kolejna metoda, która działa i może niektórym wydawać się nieco prostsza. Używa funkcji SUBSTRING_INDEX MySQL . 1 zwraca wszystko przed pierwszą spacją, a -1 zwraca wszystko po ostatniej spacji.

Zwraca „chara”:

SELECT SUBSTRING_INDEX( field1, ' ', 1 )

Zwraca „ters”:

SELECT SUBSTRING_INDEX( field1, ' ', -1 )

Detale

Wartość dodatnia będzie szukać określonego znaku od początku ciągu, a wartość ujemna rozpocznie się od końca ciągu. Wartość liczby wskazuje ilość określonego znaku do wyszukania przed zwróceniem pozostałej części ciągu. Jeśli szukany znak nie istnieje, zostanie zwrócona cała wartość pola.

W tym przypadku -2 zwróci wszystko na prawo od przedostatniej spacji, która nie istnieje w tym przykładzie, więc cała wartość pola zostanie zwrócona.

T. Brian Jones
źródło
3
Działa to również, jeśli istnieją ciągi znaków bez spacji, na przykład zadziała również „chara”.
bernhardh
2
To działało świetnie w uzyskaniu wersji głównej + pomocniczej ciągu wersji z komponentami xyz.
thomthom
4
Działa to najlepiej, gdy chcesz, aby całe pole zostało zwrócone, jeśli nie można znaleźć znaku.
stephentgrammer
Używam tego do wyodrębnienia współrzędnych geograficznych z pola ciągu, w którym gwarantuje się istnienie ogranicznika (przecinka).
ob-ivan
11

Potrzebowałbyś trochę operacji na łańcuchach . Zakładając, że każde pole ma co najmniej jedną spację:

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

Bezpieczne podejście:

SELECT IF(
    LOCATE(' ', field1),
    SUBSTR(field1, 0, LOCATE(' ', field1)),
    field1
) FROM your_table;
soulmerge
źródło
+1 dla bezpiecznej wersji, chociaż nie jest jasne, jaki wynik powinien zostać zwrócony, gdy pole nie zawiera spacji.
Mchl
2
musiał zmienić 0 na 1:SELECT SUBSTR(field1, 1, LOCATE(' ', field1)) FROM your_table;
Lluís