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 行?