mySQL提取数字或字符串取决于值

时间:2017-10-26 14:48:20

标签: mysql string casting numbers

请查看下表:

enter image description here

我需要"最后一部分" "我拥有的"如果它包含所有数字和字符串,则为数字。

在Excel中,我通过以下功能实现了这一点(如上所示):

=IFERROR(VALUE(TEXT(D2;"0"));TEXT(D2;"0"))

但是我想在mySQL中这样做才能更有效地计算。

我已经"漂浮" CASE CASTCONVERT以及TRIM功能grid.IsReadOnly = true; 左右,但我还没有能够提出一些感性的东西。

一个很好的奖励"将提取"部分"通过寻找最后的" "字符(首先" "从字符串的右边开始),但根本不知道如何实现它。

3 个答案:

答案 0 :(得分:2)

使用SUBSTRING_INDEX。

<强>查询

SELECT 
 CASE 
   WHEN SUBSTRING_INDEX(records.data, '_', -1) > 1 # is int check '00004949' returns 1
   THEN SUBSTRING_INDEX(records.data, '_', -1) + 0 # converts '00004949' to 4949
   ELSE SUBSTRING_INDEX(records.data, '_', -1)
 END
  AS word   
FROM (
  SELECT "TRA_PL_NWL_EMA_NWLY_DAI_000_20170610_IN1_01P002bc" AS DATA
  UNION  
  SELECT "TRA_PL_NWL_EMA_NWLY_DAI_000_2017_0909_JET_00004949" AS DATA

) records 

<强>结果

word      
----------
01P002bc  
4949      

答案 1 :(得分:0)

以下查询将在某种程度上完成任务:

SELECT 
case 
when SUBSTRING_INDEX(value, "_", -1) REGEXP('(^[0-9]+$)') 
     then Trim(Leading 0 from SUBSTRING_INDEX(value, "_", -1))
else SUBSTRING_INDEX(value, "_", -1)
end as Value
From yourtable;

Click here for Demo

希望它有所帮助!

答案 2 :(得分:0)

我希望这就是你想要的。 至少它符合你的要求。

SELECT 
CASE
    WHEN (
            CONVERT(
                substring(
                    txt,
                    LENGTH(txt) - LOCATE('_', REVERSE(txt))+2,
                    length(txt)
                )
                , signed integer
            )
        ) = 0
    THEN substring(
            txt,
            LENGTH(txt) - LOCATE('_', REVERSE(txt))+2,
            length(txt)
        ) 
    ELSE CONVERT(
                substring(
                    txt,
                    LENGTH(txt) - LOCATE('_', REVERSE(txt))+2,
                    length(txt)
                )
                , signed integer
            )
    END as NUMBER

from test.test

这是我的测试表和SQL的结果:

txt                         NUMBER
DA_DA_ADAD_ADAD_ADAD_asd123 asd123
DA_DA_ADAD_ADAD_ADAD_000123 123
DA_DA_ADAD_ADAD_ADAD_444    444
DA_DA_ADAD_ADAD_ADAD_bsd123 bsd123
DA_DA_ADAD_ADAD_ADAD_csd123 csd123
DA_DA_ADAD_ADAD_ADAD_dsd123 dsd123