MySQL truncate text with ellipsis

前端 未结 6 428
小鲜肉
小鲜肉 2021-01-04 01:14

Suppose I have a MySQL table of one column: \"Message\". It is of type TEXT. I now want to query all rows, but the text can be large (not extremely large but large) and I on

相关标签:
6条回答
  • 2021-01-04 01:29

    or...

    SELECT CONCAT(LEFT(message, 7), IF(LENGTH(message)>7, "…", ""))
    FROM table
    
    0 讨论(0)
  • 2021-01-04 01:37

    Have a look at the MySQL string functions, documented here. You should be able to use some combination of substring and concat to achieve your desired behaviour.

    0 讨论(0)
  • 2021-01-04 01:39

    You can declare a new ELLIPSIS function in order to make your query readable:

    DELIMITER //
    
    CREATE FUNCTION ELLIPSIS ( str TEXT, max_length INT )
    RETURNS TEXT
    
    BEGIN
       DECLARE str_out TEXT;
    
       IF LENGTH(str) <= max_length THEN
          SET str_out = str;
          
       ELSE
          SET str_out = CONCAT(SUBSTR(str, 1, max_length), '...');
    
       END IF;
       
       RETURN str_out;
    
    END; //
    
    DELIMITER ;
    

    Then you simply do:

    SELECT ELLIPSIS(Message, 10);
    
    0 讨论(0)
  • 2021-01-04 01:43

    Here's a simple one line solution:

    IF(CHAR_LENGTH(message) > 10, CONCAT(LEFT(message, 7),"..."), message)
    
    0 讨论(0)
  • 2021-01-04 01:48

    My approach:

    • Let x be the maximum number of characters to display (therefore x + 3 dots will be the longest string displayed)
    • You always want LEFT(field,x)
    • If LENGTH(field) > x + 3, append 3 dots
    • Otherwise if LENGTH(field) > x, append the remainder of field
    SELECT CONCAT(
        LEFT(field,x),
        IF(LENGTH(field) > x+3,
           '...',
            IF(LENGTH(field) > x,
                MID(field,x+1,LENGTH(field)),
                ''
            )
        )
    ) FROM table
    
    0 讨论(0)
  • 2021-01-04 01:51
    select case when length(message) > 7 
    then concat(substring(message, 1, 7), '...')
    else message end as adapted_message
    from ...
    

    to test/confirm:

    SELECT CASE WHEN LENGTH('1234567890') > 7 
    THEN CONCAT(SUBSTRING('1234567890', 1, 7), '...') 
    ELSE '1234567890' END AS adapted_message
    
    UNION  
    
    SELECT CASE WHEN LENGTH('12345') > 7 
    THEN CONCAT(SUBSTRING('12345', 1, 7), '...') 
    ELSE '12345' END AS adapted_message
    
    0 讨论(0)
提交回复
热议问题