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