Есть ли простой способ конвертировать данные MySQL в Title Case?

Синтаксис более ясен в некоторых ситуациях, в основном при работе с map и др.

map(lambda x: x * 2, [1,2,3,4])

мне кажется лучше:

def double(x):
    return x * 2

map(double, [1,2,3,4])

Я думаю лямбда - лучший выбор в этой ситуации, потому что def double кажется почти отключенным от map, который его использует. Кроме того, я полагаю, что это добавило преимущества, которые функция отбрасывает, когда вы закончите.

Существует один недостаток лямбда, который ограничивает его полезность в Python, на мой взгляд: lambdas может иметь только одно выражение (т. е. вы не можете иметь несколько строк). Он просто не может работать на языке, который заставляет пробелы.

Плюс, всякий раз, когда я использую лямбда, я чувствую себя потрясающе.

34
задан Community 23 May 2017 в 12:10
поделиться

6 ответов

Ву! Я совершенно не разбираюсь в SQL; Вот метод, который у меня сработал:

  1. Экспорт таблицы в виде текстового файла в формате .sql.
  2. Откройте файл в Textmate (который у меня уже был под рукой).

    с правильными значениями в нижнем регистре.

  3. Импортировать таблицу обратно в базу данных.
  4. Используйте UPDATE table SET colname = LOWER (colname); для сброса значений в нижнем регистре для столбцов, которые должны быть строчные буквы.

Причина, по которой я раньше не пробовал использовать Textmate, заключалась в том, что я не мог понять, как преобразовать один столбец в регистр заголовка, не разрушая другие данные, но этот метод, похоже, работает. Спасибо за руководство и поддержку!

1
ответ дан 27 November 2019 в 16:13
поделиться

вы можете сделать это с помощью concat (), substring () и length (), но я вижу, что это работает только для одного слова. Есть ли конкретная причина, по которой вы не можете сделать это в коде своего приложения вместо mysql?

1
ответ дан 27 November 2019 в 16:13
поделиться

Править

Эврика! Буквально моя первая функция SQL. Гарантия не предоставляется. Сделайте резервную копию ваших данных перед использованием. :)

Сначала определите следующую функцию:

DROP FUNCTION IF EXISTS lowerword;
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER |
CREATE FUNCTION lowerword( str VARCHAR(128), word VARCHAR(5) )
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE loc INT;

  SET loc = LOCATE(CONCAT(word,' '), str, 2);
  IF loc > 1 THEN
    WHILE i <= LENGTH (str) AND loc <> 0 DO
      SET str = INSERT(str,loc,LENGTH(word),LCASE(word));
      SET i = loc+LENGTH(word);
      SET loc = LOCATE(CONCAT(word,' '), str, i);
    END WHILE;
  END IF;
  RETURN str;
END;
|
DELIMITER ;

Это снизит количество вхождений слова в строке

Затем определите эту модифицированную правильную функцию:

DROP FUNCTION IF EXISTS tcase; 
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER | 
CREATE FUNCTION tcase( str VARCHAR(128) ) 
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN 
  DECLARE c CHAR(1); 
  DECLARE s VARCHAR(128); 
  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;

  SET s = lowerword(s, 'A');
  SET s = lowerword(s, 'An');
  SET s = lowerword(s, 'And');
  SET s = lowerword(s, 'As');
  SET s = lowerword(s, 'At');
  SET s = lowerword(s, 'But');
  SET s = lowerword(s, 'By');
  SET s = lowerword(s, 'For');
  SET s = lowerword(s, 'If');
  SET s = lowerword(s, 'In');
  SET s = lowerword(s, 'Of');
  SET s = lowerword(s, 'On');
  SET s = lowerword(s, 'Or');
  SET s = lowerword(s, 'The');
  SET s = lowerword(s, 'To');
  SET s = lowerword(s, 'Via');

  RETURN s; 
END; 
| 
DELIMITER ; 

Использование

Убедитесь, что она работает должным образом:

SELECT tcase(title) FROM table;

Использовать:

UPDATE table SET title = tcase(title);

Источник: http://www.artfulsoftware.com/infotree/queries.php?&bw=1070#122

61
ответ дан 27 November 2019 в 16:13
поделиться

Окончательный вариант поиска такой функции приведен в документации .

К сожалению, у вас есть функции LOWER () и UPPER (), но нет Название дела. Лучше всего объявить свою собственную функцию, которая разбивается на пробелы, игнорирует ваши маленькие слова и делает ПРОПИСНУЮ на первом символе каждого оставшегося слова.

0
ответ дан 27 November 2019 в 16:13
поделиться

Ответ будет зависеть от типа данных в столбце, то есть от имен людей, названий мест, названий книг и т. Д. Если вы ищете решение SQL, я будет делать это в нескольких обновлениях, например:

  1. Начальная строка: «УБИТЬ СМЕНЫ»
  2. Преобразовать в начальные заглавные буквы: «Убить A Mockingbird "
  3. Преобразование маленьких слов в нижний регистр, если они не начинают строку: «Чтобы Убить пересмешника "
0
ответ дан 27 November 2019 в 16:13
поделиться

Если вам нужно добавить в смесь собственные акронимы и другие шаблоны использования заглавных букв, я обобщил ответ hobodave:

DELIMITER |
CREATE FUNCTION replaceword( str VARCHAR(128), word VARCHAR(128) )
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN
  DECLARE loc INT;
  DECLARE punct CHAR(27) DEFAULT ' ()[]{},.-_!@;:?/''"#$%^&*<>'; 
  DECLARE lowerWord VARCHAR(128);
  DECLARE lowerStr VARCHAR(128);

  IF LENGTH(word) = 0 THEN
    RETURN str;
  END IF;
  SET lowerWord = LOWER(word);
  SET lowerStr = LOWER(str);
  SET loc = LOCATE(lowerWord, lowerStr, 1);
  WHILE loc > 0 DO
    IF loc = 1 OR LOCATE(SUBSTRING(str, loc-1, 1), punct) > 0 THEN
      IF loc+LENGTH(word) > LENGTH(str) OR LOCATE(SUBSTRING(str, loc+LENGTH(word), 1), punct) > 0 THEN
        SET str = INSERT(str,loc,LENGTH(word),word);
      END IF;
    END IF;
    SET loc = LOCATE(lowerWord, lowerStr, loc+LENGTH(word));
  END WHILE;
  RETURN str;
END;
|
DELIMITER ;

DELIMITER | 
CREATE FUNCTION tcase( str VARCHAR(128) ) 
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN 
  DECLARE c CHAR(1); 
  DECLARE s VARCHAR(128); 
  DECLARE i INT DEFAULT 1; 
  DECLARE bool INT DEFAULT 1; 
  DECLARE punct CHAR(27) 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;

  SET s = replaceword(s, 'a');
  SET s = replaceword(s, 'an');
  SET s = replaceword(s, 'and');
  SET s = replaceword(s, 'as');
  SET s = replaceword(s, 'at');
  SET s = replaceword(s, 'but');
  SET s = replaceword(s, 'by');
  SET s = replaceword(s, 'for');
  SET s = replaceword(s, 'if');
  SET s = replaceword(s, 'in');
  SET s = replaceword(s, 'n');
  SET s = replaceword(s, 'of');
  SET s = replaceword(s, 'on');
  SET s = replaceword(s, 'or');
  SET s = replaceword(s, 'the');
  SET s = replaceword(s, 'to');
  SET s = replaceword(s, 'via');

  SET s = replaceword(s, 'RSS');
  SET s = replaceword(s, 'URL');
  SET s = replaceword(s, 'PHP');
  SET s = replaceword(s, 'SQL');
  SET s = replaceword(s, 'OPML');
  SET s = replaceword(s, 'DHTML');
  SET s = replaceword(s, 'CSV');
  SET s = replaceword(s, 'iCal');
  SET s = replaceword(s, 'XML');
  SET s = replaceword(s, 'PDF');

  SET c = SUBSTRING( s, 1, 1 ); 
  IF c >= 'a' AND c <= 'z' THEN  
      SET s = CONCAT(UCASE(c),SUBSTRING(s,2)); 
  END IF; 

  RETURN s; 
END; 
| 
DELIMITER ;

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

Надеюсь, это кому-то поможет.

9
ответ дан 27 November 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: