【问题标题】:mySQL extract number or string depending on valuemySQL 根据值提取数字或字符串
【发布时间】:2017-10-26 14:48:20
【问题描述】:

请看下表:

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

在 Excel 中,我使用以下函数(如上所示)实现了这一点:

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

但是我想在 mySQL 中执行此操作以便更有效地计算。

我用CASTCONVERT 以及TRIM 函数“漂浮”在CASE 附近的某个地方,但我无法提出一些有意义的东西。

一个不错的“奖励”是通过查找最后一个“”字符(所以从字符串右侧的第一个“”)提取“部分部分”,但根本不知道如何实现这一目标。

【问题讨论】:

  • 请注意,SQL 结果的一列只能有一种类型,因此可以是字符串 数字。您可以在单个列中将所有值作为字符串返回,也可以在一个列中返回字符串,在另一列中返回数字。如果您只想从数字中删除前导 0s,您可以使用 CASEUNION 或...
  • 请提供 MySQL 中的 CREATE TABLE 语句和 INSERT 语句,而不是图像作为数据。

标签: mysql string casting numbers


【解决方案1】:

使用 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      

【讨论】:

    【解决方案2】:

    以下查询将在一定程度上完成任务:

    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

    希望对你有帮助!

    【讨论】:

    • 000000ASDF 这样的东西呢?
    • @JimmyB 我已经编辑了答案。它现在应该可以工作了。谢谢指出。
    【解决方案3】:

    我希望这是你想要的。 至少它可以满足您的要求。

    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
    

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多