Кто-нибудь знает эквивалент этого TSQL в языке MySQL?
Я пытаюсь загладить первую букву каждой записи.
UPDATE tb_Company SET CompanyIndustry = UPPER(LEFT(CompanyIndustry, 1))
+ SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Кто-нибудь знает эквивалент этого TSQL в языке MySQL?
Я пытаюсь загладить первую букву каждой записи.
UPDATE tb_Company SET CompanyIndustry = UPPER(LEFT(CompanyIndustry, 1))
+ SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Это почти то же самое, вам просто нужно перейти на использование функции CONCAT() вместо оператора +:
UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)),
SUBSTRING(CompanyIndustry, 2));
Это превратило бы hello
в hello
, wOrLd
в wOrLd
, BLABLA
в BLABLA
и т.д. Если вы хотите в верхнем регистре первой буквы и в нижнем регистре другой, вы просто нужно использовать функцию LCASE:
UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)),
LCASE(SUBSTRING(CompanyIndustry, 2)));
Обратите внимание, что UPPER и UCASE делают то же самое.
Отличный ответ Vincents для Uppercase First Letter отлично подходит для заглавных букв только первой буквы всей строки столбца.
НО, что если вы хотите использовать заглавные буквы первой буквы каждого слова в строках столбца таблицы?
Например: "Средняя школа Абвиль"
Я не нашел ответа на это в Stackoverflow. Мне пришлось собрать воедино несколько ответов, которые я нашел в Google, чтобы найти надежное решение для приведенного выше примера. Это не встроенная функция, а созданная пользователем функция, которую допускает версия MySQL 5+.
Если у вас есть статус пользователя Super/Admin в MySQL или у вас установлена локальная версия mysql на вашем компьютере, вы можете создать функцию (например, хранимую процедуру), которая будет храниться в вашей базе данных и использоваться во всех будущих SQL-запросах в любой части дб.
Созданная мной функция позволяет мне использовать эту новую функцию, которую я назвал "UC_Words", точно так же, как встроенные встроенные функции MySQL, чтобы я мог обновить полный столбец следующим образом:
UPDATE Table_name
SET column_name = UC_Words(column_name)
Чтобы вставить код функции, я изменил стандартный разделитель MySQL (;) при создании функции, а затем вернул ее в нормальное состояние после сценария создания функции. Я также лично хотел, чтобы вывод был в UTF8 CHARSET.
Создание функции =
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 ' ()[]{},[email protected];:?/';
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 ;
Это работает, выводя заглавные буквы в нескольких словах в строке.
Предполагая, что ваше имя пользователя для входа в MySQL имеет достаточные привилегии - если нет, и вы не можете настроить временную БД на своем персональном компьютере для преобразования ваших таблиц, то спросите своего провайдера общего хостинга, установят ли они эту функцию для вас.
Вы можете использовать комбинацию UCASE()
, MID()
и CONCAT()
:
SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
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
http://forge.mysql.com/tools/tool.php?id=201
Если в столбце более 1 слова, это не будет работать, как показано ниже. Упомянутый выше UDF может помочь в таком случае.
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)
Или, может быть, этот поможет...
Это хорошо работает.
Состояние UPDATE SET name = CONCAT (UCASE (LEFT (имя, 1)), LCASE (SUBSTRING (имя, 2)));
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) +
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
СОЗДАТЬ ФУНКЦИЮ:
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)))
ИСПОЛЬЗУЙТЕ ФУНКЦИЮ
UPDATE tbl_name SET col_name = UC_FIRST(col_name);
Если кто-нибудь попытается использовать каждое слово, написанное пробелом...
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)[email protected]+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;
Результат
+--------------+
| name |
+--------------+
| Abdul Karim |
+--------------+
Это должно хорошо работать:
UPDATE tb_Company SET CompanyIndustry =
CONCAT(UPPER(LEFT(CompanyIndustry, 1)), SUBSTRING(CompanyIndustry, 2))
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)));
select CONCAT(UCASE(LEFT('CHRIS', 1)),SUBSTRING(lower('CHRIS'),2));
Вышеупомянутое утверждение может использоваться для первой буквы CAPS и отдыха как нижнего регистра.
Усо также простой ассим;)
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 ;