0

我正在使用以下内容仅从列中选择前 40 个字符

SELECT SUBSTRING(w.item_title,1,40) as title from tableName blah blah

我真正想做的是:

如果w.item_title超过 40 个字符,则仅返回前 40 个字符并附加 ... 否则w.item_title按原样返回

这在SELECT阶段是可能的吗?应该在那里完成吗?还是应该事后处理?

我正在使用 JS 来显示结果。

4

4 回答 4

1
SELECT SUBSTR(INSERT(w.item_title, 41, 3, '...'), 1, 43)
  FROM ...

有关示例,请参见INSERT() String 函数的手册。

INSERT(str,pos,len,newstr)
返回字符串 str,子字符串从位置 pos 开始,len 个字符 long 被字符串 newstr 替换。如果 pos 不在字符串的长度范围内,则返回原始字符串。如果 len 不在字符串其余部分的长度范围内,则从位置 pos 替换字符串的其余部分。如果任何参数为 NULL,则返回 NULL。

EDIT
Last parameter of SUBSTR should be 43 as pointed out by Joachim.

于 2013-01-13T10:37:30.077 回答
0

询问:

SELECT CASE WHEN LENGTH(w.item_title)>40
            THEN SUBSTRING(w.item_title,1,40)
            ELSE w.item_title END as title 
from tableName w
于 2013-01-13T10:24:23.157 回答
0

您可以只使用“IF”来附加您的后缀;

SELECT CONCAT(SUBSTRING(w.item_title,1,40),
              IF(LENGTH(w.item_title)>40, '...', '')) as title 
FROM tableName w

SQLfiddle 演示在这里

关于它是否应该在数据库中完成,这是一个更棘手的问题,可以一如既往地用“它取决于”来回答。

如果您的文本很长(例如文章),如果您只需要前 40 个字符,那么您不想传输整篇文章是相当明确的,但如果文本很短,您可能希望从数据库。添加 Web 服务器很容易,但扩展数据库的成本很高。

于 2013-01-13T10:26:25.633 回答
0

你也可以试试Left

SELECT CONCAT(Left(w.item_title,40),
              IF(LENGTH(w.item_title)>40, 'something', '')) as title 
FROM tableName w
;

其他:

SELECT case when Length(w.item_title) > 40 then 
       Left(w.item_title,40) else
       CONCAT(coalesce(w.item_title,''), 'something') End as title 
FROM tableName w
;
于 2013-01-13T10:37:06.557 回答