SQL查询:如何仅在数据不包含字母时将数据转换为数字

SQL query: how to convert data to numbers only when it does not contains letters

提问人:Luc-Olivier Pineau 提问时间:6/22/2023 最后编辑:jarlhLuc-Olivier Pineau 更新时间:6/24/2023 访问量:480

问:

从 SQL Server 中提取 ERP 产品的引用时,会将其提取为文本。 这些引用有时只包含数字,有时包含数字 + 字母 CN。 当它只包含数字时,我想将其提取为数字,如果它包含字母 CN,则将其提取为文本。不幸的是,我没有找到一种方法。

这就是我尝试过的(“INVMB.MB110“是 SQL Server 中的”引用“字段):

SELECT
CASE 
WHEN INVMB.MB110 LIKE '%CN%' 
THEN INVMB.MB110 
ELSE CAST(INVMB.MB110 AS INT) END 
AS 'Reference'

我期望仅在引用不包含“CN”时才转换为整数,但似乎它在任何情况下都会尝试转换它。这是我收到的错误消息:

无法将 varchar 值“30903CN013”转换为数据类型 int。

sql-server 转换 整数 varchar

评论

2赞 jarlh 6/22/2023
事例表达式:所有 THEN 值必须具有兼容的数据类型。这意味着 your 隐式被强制转换为 int。THEN INVMB.MB110
2赞 Charlieface 6/22/2023
“当它只包含数字时,我想将其提取为数字,如果它包含字母,我想将其提取为文本”这是什么意思?一个列只能有一种数据类型,您想要哪种类型?
0赞 Luc-Olivier Pineau 6/22/2023
@jarlh,好的,谢谢你的信息。
0赞 Luc-Olivier Pineau 6/22/2023
@Charlieface,感谢您提供此信息。如果我必须选择一种数据类型,那么我需要整数。不过,这将如何处理包含字母的数据?
0赞 Charlieface 6/22/2023
它不会。不能将字母和标点符号存储在数字列中。您需要决定是否要返回它。你可以返回,例如NULLSELECT TRY_CAST(INVMB.MB110 AS INT) AS Reference

答:

1赞 Edmond Quinton 6/22/2023 #1

您可以创建两列,一列用于字符串数据,另一列用于数值数据。假设你有 SQL Server 2016 或更高版本,则可以使用 or 函数。TRY_CONVERTTRY_PARSE

SELECT
    [INVMB.MB110_INT] = TRY_CONVERT(INT, [INVMB.MB110])
    ,[INVMB.MB110_STRING] = [INVMB.MB110]
    ,[IsNumberDataType] = CASE WHEN TRY_CONVERT(INT, [INVMB.MB110]) IS NULL THEN 0 ELSE 1 END

如果可能,该函数会将字符串转换为数字,否则它将返回 NULL。TRY_CONVERT

请注意,如果源字符串为空字符串,则该函数将返回数值 0。如果您不希望将 0 重新调整为空字符串,请使用该函数。TRY_CONVERTTRY_PARSE

如果绝对需要单个列中的值,则可以将这些值转换为SQL_VARIANT类型(在将字符串转换为所需的基类型之后)。我个人避免像瘟疫这样的SQL_VARIANT类型,它们有太多的性能和隐式转换问题。我包含了一个返回一些示例数据的查询示例。

WITH VariantSampleData
AS
(
    SELECT 
        variant_value = TRY_CONVERT(SQL_VARIANT, TRY_CONVERT(INT, '123') )
    UNION ALL
    SELECT
        variant_value = TRY_CONVERT(SQL_VARIANT, 'abc' )
)
SELECT
    variant_value
    ,BaseType = SQL_VARIANT_PROPERTY(variant_value,'BaseType')
    ,[math] = TRY_CONVERT(INT, variant_value) + 1
FROM
    VariantSampleData

评论

0赞 Luc-Olivier Pineau 6/23/2023
谢谢你的回答。我想我想做的是,如果没有你提议的血清柱,这是不可行的。
0赞 Edmond Quinton 6/24/2023
@Luc-OlivierPineau,您可以使用sql_variant数据类型将不同的数据类型存储在一列中,但要对值执行任何操作,您仍然需要将变体转换回基本数据类型。使用sql_variant时也会产生很多性能开销,在查询数据时可能会遇到各种隐式转换问题。