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

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

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

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

不知道该怎么做。

【问题讨论】:

标签: mysql


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2014-08-14
        • 2012-02-15
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 2015-10-15
        • 2017-05-13
        相关资源
        最近更新 更多