【问题标题】:SQL error: [2620 : HY000] The format or data contains a bad character [duplicate]SQL错误:[2620:HY000]格式或数据包含错误字符[重复]
【发布时间】:2021-05-27 01:55:38
【问题描述】:

上下文

game_progress 列的类型为 varchar。它包含以下值:

1 级、10 级、12 级、20 级

我希望 WHERE 条件仅查看此字符串值中的数字。

我尝试了什么

我正在尝试在 Teradata DBMS 上执行以下 SQL 查询。

SELECT user_id, CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER)
FROM database1.vw_ft_rockroll a
INNER JOIN database1.vw_dim_rockroll b on a.progress_id = b.progress_id
WHERE user_key = 21111111 and game_type = 'LEVEL'
and CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER) < 15

如果我不包含最后一个以&lt; 15 结尾的where 条件,则查询有效。 当我输入 and CAST(REGEXP_REPLACE(game_progression, 'LEVEL ', '') as INTEGER) &lt; 15 时,它给了我这个 SQL 错误:

[2620 : HY000] 格式或数据包含错误字符

另一次尝试失败

另外,如果我只尝试在添加and CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER) &lt; 15 之前平均它的工作级别数。 添加后,我收到以下错误:

计算过程中发生数值溢出。

SELECT AVG(CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER)) FROM database1.vw_ft_rockroll a
INNER JOIN database1.vw_dim_rockroll b on a.progress_id  = b.progress_id 
WHERE user_key = 21111111 and game_progression_type = 'LEVEL'
and CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER) < 15

有谁知道如何解决这个问题?

【问题讨论】:

  • 请始终将您的数据库管理系统(DB 或 DBMS)作为标签发布到问题中。你研究过sql error 2620的SO吗?我找到了一个answer,表示terradata 是DBMS。
  • 是的,对不起,这是给 Teradata 的!
  • 您是否真的阅读了上一个问题的答案/cmets? stackoverflow.com/q/66352258/2527905

标签: sql casting teradata


【解决方案1】:

我建议按照分析步骤来寻求解决方案:

  1. 在您的 DBMS 文档 (Teradata) 中搜索错误
  2. 在转换前检查值
  3. 注意可能的极端情况

在您的 DBMS 文档 (Teradata) 中搜索错误

您的错误信息:

[2620 : HY000] 格式或数据包含错误字符。

可以在Teradata Documentation上找到解释:

此错误表明用户提交了格式非法的数字到字符的转换,或者在字符到数字的转换中,数据或格式包含错误字符。

推荐的补救措施是:

验证使用的格式。如果合法,则在从字符转换为数字的数据中存在非法字符。

在转换前检查值

错误解释表明在从文本到数字的转换过程中出现问题。要隔离此问题,请尝试没有(之前)casting 的情况:在您的 SELECT 列表中删除 CAST 并保留内部表达式,如:

SELECT REGEXP_REPLACE(game_progress, 'LEVEL ', '')

这应该返回具有所需格式(没有坏字符)以允许转换为数字(即 INTEGER)的预期值。

要使CAST(&lt;expression&gt; as INTEGER) 正常工作,&lt;expression&gt; 必须始终返回一个有效数字,即表示为文本的整数。

但是你实际得到的结果是什么? 我们假设(由您的字段描述给出)以下值:

  • LEVEL 1 被 REGEXP 替换为 1
  • LEVEL 10 被 REGEXP 替换为 0
  • LEVEL 12 被 REGEXP 替换为 12
  • LEVEL 20 被 REGEXP 替换为 20

注意可能的极端情况

NULL 值或 空文本 呢?格式错误的文本不符合LEVEL n 格式怎么办?

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 2018-01-21
    • 2018-11-18
    • 2018-07-27
    • 1970-01-01
    • 2018-10-25
    • 2021-02-17
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多