MySQL IF以数字开头做X,否则做Y [重复]

Posted

技术标签:

【中文标题】MySQL IF以数字开头做X,否则做Y [重复]【英文标题】:MySQL IF begins with a number do X, else do Y [duplicate] 【发布时间】:2013-01-21 20:54:30 【问题描述】:

可能重复:mysql - If It Starts With A Number Or Special CharacterSelect values that begin with a number

我正在尝试创建一个 ORDER BY 语句来检查列是否以数字开头,如果是,则应在列中添加 + 0。如果没有,则没有。

类似IF(title begins with number, title + 0, title)

不知道该怎么做。

【问题讨论】:

可能重复:Select values that begin with a number; MySQL - If It Starts With A Number Or Special Character 【参考方案1】:
ORDER BY IF(title REGEXP '^[0-9]',title+0,title)

但是,该表达式将返回一个数值;并且由于“title+0”本质上等于“title”(就数值比较而言),我认为这不会达到你想要的效果。

(“+0”操作将在字符串值的前导数字部分添加零,并返回一个数字值;因此整个表达式将被评估为一个数字值。这意味着裸露的“标题”将也是一个数值,如果没有前导数值,则返回0。

所以,这基本上等同于:

ORDER BY title+0

您实际上希望按什么顺序返回标题值?您是否希望按前导数字的顺序返回行,然后按标题字符串?

当没有前导数字时,我想你想按title 的字符串值排序;否则,通过前导数字的数值,然后是标题的字符串值,所以这样的事情可能会让你更接近你想要的:

ORDER BY title REGEXP '^[0-9]', title+0, title

【讨论】:

【参考方案2】:

您可以强制将标题解释为整数并测试它是否 >= 1:

ORDER BY IF(title+0 >= 1, title+0, title)

但我必须评论,听起来您将一列用于两种不同的目的,这在关系数据库设计中是一个禁忌。

而且它会很慢,因为 ORDER BY 不能从索引中受益。

【讨论】:

好吧,因为我一次只能抓取 50 个结果,所以我不太担心速度。我选择认为缺乏自然排序顺序是手头的真正问题。【参考方案3】:
if title LIKE 'number%' then
    CONCAT(title, '0');
end if;

【讨论】:

【参考方案4】:
if (left(title,1) regexp '[0-9]', title+0, title)

if (title regexp '^[0-9]', title+0, title)

【讨论】:

以上是关于MySQL IF以数字开头做X,否则做Y [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何消除可能以或不以 www 开头的“重复”URL MySQL 行?

MySQL批量导出以某数字或字母开头的表

如果变量=数字,做X,否则啥都不做

php 5,for循环没有正确显示以0开头的数字系列[重复]

在1-1680范围内随机选择一个数字[重复]

JavaScript 变量