sql >> データベース >  >> RDS >> Mysql

MySQLでの文字列文字の並べ替え

    おそらく非常に非効率的ですが、ユーザー定義関数は必要ありません:

    SELECT GROUP_CONCAT(LETTER SEPARATOR '') AS ReOrderedLetters
      FROM ( SELECT 'A' as LETTER FROM <table> WHERE UPPER(`name`) like '%A%'
             UNION ALL
             SELECT 'B' as LETTER FROM <table> WHERE UPPER(`name`) like '%B%'
             UNION ALL
             SELECT 'C' as LETTER FROM <table> WHERE UPPER(`name`) like '%C%'
             UNION ALL
             SELECT 'D' as LETTER FROM <table> WHERE UPPER(`name`) like '%D%'
             ...
             UNION ALL
             SELECT 'Y' as LETTER FROM <table> WHERE UPPER(`name`) like '%Y%'
             UNION ALL
             SELECT 'Z' as LETTER FROM <table> WHERE UPPER(`name`) like '%Z%'
           ) alpha
    

    編集

    私は寝る前にもっと良い選択肢を考え出さなければなりませんでした。さもなければ私は眠る必要がありませんでした。したがって、これははるかにクリーンで効率的な代替手段です。

    letterという名前のVARCHAR(1)の単一列を持つlettersというテーブルを作成し、そのテーブルにAからZまでの文字を入力しました

    CREATE TABLE IF NOT EXISTS `letters` (
       `letter` varchar(1) NOT NULL,
       PRIMARY KEY (`letter`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `letters` (`letter`) VALUES
    ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),
    ('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z');
    

    次に:

    select U.`name`,
           GROUP_CONCAT(L.`letter` 
               ORDER BY L.`letter` ASC 
              SEPARATOR '') AS ReOrderedLetters 
      FROM `users` U 
      LEFT JOIN `letters` L ON POSITION(L.`letter` IN UPPER(U.`name`)) > 0
     GROUP BY U.`name`
    


    1. PHPでのリモートMySQL接続

    2. 正しくエンコードされていないデータを含むMySQLテーブルをUTF-8に変換する

    3. PDOMysqlを使用した正規表現

    4. NHibernate MappingException:byte[]の永続性がありません