Zacznij wielką literę. MySQL

110

Czy ktoś zna odpowiednik tego TSQL w języku MySQL?

Próbuję wielką literą każdego wpisu.

UPDATE tb_Company SET CompanyIndustry = UPPER(LEFT(CompanyIndustry, 1))
+ SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Broda
źródło

Odpowiedzi:

275

To prawie to samo, wystarczy zmienić, aby użyć funkcji CONCAT () zamiast operatora +:

UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)), 
                             SUBSTRING(CompanyIndustry, 2));

To zamieniłoby hellosię w Hello, wOrLddo WOrLd, BLABLAdo BLABLAitd. Jeśli chcesz pisać wielką literą pierwszą literę, a małą drugą, wystarczy użyć funkcji LCASE:

UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)), 
                             LCASE(SUBSTRING(CompanyIndustry, 2)));

Zauważ, że UPPER i UCASE robią to samo.

Vincent Savard
źródło
1
dzięki - zrobiłem to, czego potrzebowałem. Zapomniałem wspomnieć, że najpierw muszę ustawić małe litery. dzięki
Chin
55

Vincents doskonała odpowiedź na wielkie litery Pierwszego Listu działa świetnie na pierwszej literze tylko kapitalizacja całej kolumny ciąg ..

ALE co, jeśli chcesz, aby pierwsza litera KAŻDEGO słowa była pisana wielką literą w ciągach kolumny tabeli?

np. „Abbeville High School”

Nie znalazłem odpowiedzi na to pytanie w Stackoverflow. Musiałem zebrać razem kilka odpowiedzi, które znalazłem w Google, aby zapewnić solidne rozwiązanie powyższego przykładu. Nie jest to funkcja natywna, ale funkcja utworzona przez użytkownika, na którą pozwala MySQL w wersji 5+.

Jeśli masz status użytkownika Super / Admin na MySQL lub lokalną instalację mysql na swoim komputerze, możesz stworzyć FUNKCJĘ (taką jak procedura składowana), która będzie znajdować się w Twojej bazie danych i będzie używana we wszystkich przyszłych zapytaniach SQL w dowolnej części db.

Funkcja, którą utworzyłem, pozwala mi używać tej nowej funkcji, którą nazwałem „UC_Words”, podobnie jak wbudowanych funkcji natywnych MySQL, dzięki czemu mogę zaktualizować całą kolumnę w następujący sposób:

UPDATE Table_name
SET column_name = UC_Words(column_name) 

Aby wstawić kod funkcji, zmieniłem standardowy separator MySQL (;) podczas tworzenia funkcji, a następnie przywróciłem go do normalnego po skrypcie tworzenia funkcji. Osobiście chciałem również, aby wyjście było w UTF8 CHARSET.

Tworzenie funkcji =

DELIMITER ||  

CREATE FUNCTION `UC_Words`( str VARCHAR(255) ) RETURNS VARCHAR(255) CHARSET utf8 DETERMINISTIC  
BEGIN  
  DECLARE c CHAR(1);  
  DECLARE s VARCHAR(255);  
  DECLARE i INT DEFAULT 1;  
  DECLARE bool INT DEFAULT 1;  
  DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';  
  SET s = LCASE( str );  
  WHILE i < LENGTH( str ) DO  
     BEGIN  
       SET c = SUBSTRING( s, i, 1 );  
       IF LOCATE( c, punct ) > 0 THEN  
        SET bool = 1;  
      ELSEIF bool=1 THEN  
        BEGIN  
          IF c >= 'a' AND c <= 'z' THEN  
             BEGIN  
               SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1));  
               SET bool = 0;  
             END;  
           ELSEIF c >= '0' AND c <= '9' THEN  
            SET bool = 0;  
          END IF;  
        END;  
      END IF;  
      SET i = i+1;  
    END;  
  END WHILE;  
  RETURN s;  
END ||  

DELIMITER ; 

Działa to bardzo przyjemnie, wyświetlając pierwsze wielkie litery w wielu słowach w ciągu.

Zakładając, że Twoja nazwa użytkownika logowania MySQL ma wystarczające uprawnienia - jeśli nie, i nie możesz skonfigurować tymczasowej bazy danych na swoim osobistym komputerze, aby konwertować tabele, zapytaj swojego współdzielonego dostawcę hostingu, czy ustawi tę funkcję za Ciebie.

Martin Sansone - MiOEE
źródło
4
CHARSET utf8_general_cinależy zmienić na CHARSET utf8(przynajmniej w dniu 5.7)
Manuel
@ManuelDallaLana faktycznie możesz otrzymać błąd, Illegal mix of collations for operation 'concat'więc myślę, że po prostu napraw zestaw znaków lub usuń go i ustaw go jako domyślny.
Al-Mothafar
@Alejandro Ta odpowiedź składa się z pierwszej litery każdego słowa w ciągu. Pytanie i zaakceptowana odpowiedź są wielką literą tylko pierwszej litery ciągu. Oba są super pomocnymi odpowiedziami, ale dla różnych przypadków użycia.
Liam
Wystąpił błąd, musisz zadeklarować 's' z zestawem znaków "DECLARE s VARCHAR (255) CHARSET utf8;" albo stracisz niektóre znaki. W każdym razie dzięki za to rozwiązanie :-)
Jérôme Herry
A także 'c': "DECLARE c CHAR (1) CHARSET utf8;"
Jérôme Herry
17

Można użyć kombinacji UCASE(), MID()i CONCAT():

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
Wouter Dorgelo
źródło
nie zmniejsza to wszystkich innych liter. SpróbujSELECT CONCAT(UCASE(MID('TEST',1,1)),MID('TEST',2));
vladkras
8
mysql> SELECT schedule_type AS Schedule FROM ad_campaign limit 1;
+----------+
| Schedule |
+----------+
| ENDDATE  |
+----------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT(UCASE(MID(schedule_type,1,1)),LCASE(MID(schedule_type,2))) AS Schedule FROM ad_campaign limit 1;
+----------+
| Schedule |
+----------+
| Enddate  |
+----------+
1 row in set (0.00 sec)

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_mid

Korzeń
źródło
5

http://forge.mysql.com/tools/tool.php?id=201

Jeśli w kolumnie jest więcej niż 1 słowo, to nie zadziała, jak pokazano poniżej. Wspomniany wyżej UDF może w takiej sytuacji pomóc.

mysql> select * from names;
+--------------+
| name         |
+--------------+
| john abraham | 
+--------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
+--------------+
| name         |
+--------------+
| John abraham | 
+--------------+
1 row in set (0.00 sec)

A może ten pomoże ...

https://github.com/mysqludf/lib_mysqludf_str#str_ucwords

shantanuo
źródło
2

To działa dobrze.

UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));
Abhinav Sahu
źródło
1
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) + 
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Jasdeep Singh
źródło
właśnie próbowałem zaznaczyć funkcję UCASE w MySQL: P :)
Jasdeep Singh
1

UTWÓRZ FUNKCJĘ:

CREATE DEFINER=`root`@`localhost` FUNCTION `UC_FIRST`(`oldWord` VARCHAR(255)) 

RETURNS varchar(255) CHARSET utf8

RETURN CONCAT( UCASE( LEFT(oldWord, 1)), LCASE(SUBSTRING(oldWord, 2)))

UŻYJ FUNKCJI

UPDATE tbl_name SET col_name = UC_FIRST(col_name);
Florin
źródło
1

Jeśli ktoś spróbuje zapisać każde słowo wielką literą, oddzielając je spacją ...

CREATE FUNCTION response(name VARCHAR(40)) RETURNS VARCHAR(200) DETERMINISTIC
BEGIN
   set @m='';
   set @c=0;
   set @l=1;
   while @c <= char_length(name)-char_length(replace(name,' ','')) do
      set @c = @c+1;
      set @p = SUBSTRING_INDEX(name,' ',@c);
      set @k = substring(name,@l,char_length(@p)-@l+1);
      set @l = char_length(@k)+2;
      set @m = concat(@m,ucase(left(@k,1)),lcase(substring(@k,2)),' ');
   end while;
   return trim(@m); 
END;
CREATE PROCEDURE updateNames()
BEGIN
  SELECT response(name) AS name FROM names;
END;

Wynik

+--------------+
| name         |
+--------------+
| Abdul Karim  | 
+--------------+
Jahir islam
źródło
0

To powinno dobrze działać:

UPDATE tb_Company SET CompanyIndustry = 
CONCAT(UPPER(LEFT(CompanyIndustry, 1)), SUBSTRING(CompanyIndustry, 2))
Chris Hutchinson
źródło
0
UPDATE users
SET first_name = CONCAT(UCASE(LEFT(first_name, 1)), 
                             LCASE(SUBSTRING(first_name, 2)))
,last_name = CONCAT(UCASE(LEFT(last_name, 1)), 
                             LCASE(SUBSTRING(last_name, 2)));
sandeep kumar
źródło
0
 select  CONCAT(UCASE(LEFT('CHRIS', 1)),SUBSTRING(lower('CHRIS'),2));

Powyższe wyrażenie może być użyte jako pierwsze litery DUŻE, a pozostałe jako małe.

Aamir Khan
źródło
-1

Uso algo simples assim;)

DELIMITER $$
DROP FUNCTION IF EXISTS `uc_frist` $$
CREATE FUNCTION `uc_frist` (str VARCHAR(200)) RETURNS varchar(200)
BEGIN
    set str:= lcase(str);
    set str:= CONCAT(UCASE(LEFT(str, 1)),SUBSTRING(str, 2));
    set str:= REPLACE(str, ' a', ' A');
    set str:= REPLACE(str, ' b', ' B');
    set str:= REPLACE(str, ' c', ' C');
    set str:= REPLACE(str, ' d', ' D');
    set str:= REPLACE(str, ' e', ' E');
    set str:= REPLACE(str, ' f', ' F');
    set str:= REPLACE(str, ' g', ' G');
    set str:= REPLACE(str, ' h', ' H');
    set str:= REPLACE(str, ' i', ' I');
    set str:= REPLACE(str, ' j', ' J');
    set str:= REPLACE(str, ' k', ' K');
    set str:= REPLACE(str, ' l', ' L');
    set str:= REPLACE(str, ' m', ' M');
    set str:= REPLACE(str, ' n', ' N');
    set str:= REPLACE(str, ' o', ' O');
    set str:= REPLACE(str, ' p', ' P');
    set str:= REPLACE(str, ' q', ' Q');
    set str:= REPLACE(str, ' r', ' R');
    set str:= REPLACE(str, ' s', ' S');
    set str:= REPLACE(str, ' t', ' T');
    set str:= REPLACE(str, ' u', ' U');
    set str:= REPLACE(str, ' v', ' V');
    set str:= REPLACE(str, ' w', ' W');
    set str:= REPLACE(str, ' x', ' X');
    set str:= REPLACE(str, ' y', ' Y');
    set str:= REPLACE(str, ' z', ' Z');
    return  str;
END $$
DELIMITER ;
Hton
źródło