Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL根据值提取数字或字符串_Mysql_String_Casting_Numbers - Fatal编程技术网

mySQL根据值提取数字或字符串

mySQL根据值提取数字或字符串,mysql,string,casting,numbers,Mysql,String,Casting,Numbers,请看下表: 我需要“我拥有的”的“最后一部分”是数字,如果它都是数字,如果它包含字符则是字符串 在Excel中,我通过以下功能实现了这一点(如上所示): 但是我想在mySQL中这样做,以便更有效地计算 我已经用CAST或CONVERT和TRIM函数在CASE中“浮动”了一些地方,但我还不能提出一些有意义的东西 一个很好的“好处”是通过查找字符串右侧的最后一个“”字符(所以是第一个“”)来提取“部分”,但根本不知道如何实现这一点。使用子字符串索引 查询 SELECT CASE WHE

请看下表:

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

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

但是我想在mySQL中这样做,以便更有效地计算

我已经用
CAST
CONVERT
TRIM
函数在
CASE
中“浮动”了一些地方,但我还不能提出一些有意义的东西

一个很好的“好处”是通过查找字符串右侧的最后一个“”字符(所以是第一个“”)来提取“部分”,但根本不知道如何实现这一点。

使用子字符串索引

查询

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      
使用子字符串索引

查询

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      

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

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;


希望有帮助

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

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;


希望有帮助

我希望这就是你想要的。 至少它满足了你的要求

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

我希望这就是你想要的。 至少它满足了你的要求

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

请注意,SQL结果的一列只能有一种类型,因此可以是字符串或数字。可以在单个列中以字符串形式返回所有值,也可以在一个列中返回字符串,在另一个列中返回数字。如果您只想从数字中删除前导的
0
s,可以使用
CASE
、或
UNION
、或…来完成,请提供CREATE TABLE语句和INSERT语句voor或MySQL。。请注意,SQL结果的一列只能有一种类型,因此可以是字符串类型,也可以是数字类型。可以在单个列中以字符串形式返回所有值,也可以在一个列中返回字符串,在另一个列中返回数字。如果您只想从数字中删除前导的
0
s,可以使用
CASE
、或
UNION
、或…来完成,请提供CREATE TABLE语句和INSERT语句voor或MySQL。。而不是作为数据的图像。像
000000ASDF
这样的东西呢?@JimmyB我已经编辑了答案。现在应该可以了。谢谢你指出这一点。像
000000ASDF
这样的事情呢?@JimmyB我已经编辑了答案。现在应该可以了。Thnx用于指出它。