提问人:Luc-Olivier Pineau 提问时间:6/22/2023 最后编辑:jarlhLuc-Olivier Pineau 更新时间:6/24/2023 访问量:480
SQL查询:如何仅在数据不包含字母时将数据转换为数字
SQL query: how to convert data to numbers only when it does not contains letters
问:
从 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。
答:
1赞
Edmond Quinton
6/22/2023
#1
您可以创建两列,一列用于字符串数据,另一列用于数值数据。假设你有 SQL Server 2016 或更高版本,则可以使用 or 函数。TRY_CONVERT
TRY_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_CONVERT
TRY_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时也会产生很多性能开销,在查询数据时可能会遇到各种隐式转换问题。
评论
THEN INVMB.MB110
NULL
SELECT TRY_CAST(INVMB.MB110 AS INT) AS Reference