【问题标题】:How can I grab a value of a column that is set as a string?如何获取设置为字符串的列的值?
【发布时间】:2021-05-26 20:28:44
【问题描述】:

我有一个表,其中包含一个包含级别列表的列。此列的数据类型为字符串。我正在尝试将级别的值作为整数获取,以便为我提供级别低于特定数字的人员列表。

我试过运行这个:

    SELECT ukey, game_progress
    FROM point_review.vw_ft_level_progress a
    INNER JOIN point_review.vw_dim_level_progress b on a.game_progress_key = b.game_progress_key
    where ukey = 2111222 AND game_progression_type = 'Level' 
    and (CAST(REGEXP_REPLACE(game_progress, 'LEVEL ', '') as INTEGER)) < 15

但是,我不断收到一条错误消息:格式或数据包含错误字符。

这是在 Teradata 中

表A

Column 1 Column 2
Joey Level 2
Rachel Level 4
Ross Level 30
Pheobe Level 2
Monica Level 3
Chandler Level 20

RESULT 应该只有:Joey、Rachel、Phoebe 和 Monica,因为他们的等级低于 15。

////

Column 1 Column 2
Joey Level 2
Rachel Level 4
Pheobe Level 2
Monica Level 3

【问题讨论】:

  • 你真正使用的是哪个数据库
  • 重复我的评论从一个到一个答案。如果这个数据库是你自己设计的,为什么要把关卡存储为字符串?将其存储为数字,瞧!如果您需要在某处显示“Level x”,只需在需要时构建该字符串。

标签: sql teradata


【解决方案1】:

你可能有一些隐藏的空格和/或区分大小写的问题

SELECT ukey, game_progress
FROM point_review.vw_ft_level_progress a
INNER JOIN point_review.vw_dim_level_progress b on a.game_progress_key = b.game_progress_key
where ukey = 2111222 AND game_progression_type = 'Level' 
and (CAST(REGEXP_REPLACE(loweer(TRIM(game_progress)), 'level', '') as INTEGER)) < 15

【讨论】:

  • 你好,这也不起作用:(你认为我可以尝试其他什么吗?
  • 根据您提供的示例,这应该可以工作..确保其他条件也为真,,
  • @Charlie:请具体说明什么“也不起作用”。如果我们不知道结果输出,我们将无能为力:(
【解决方案2】:

首先。感谢您在这里发布您的问题。之前没用过CAST,但它是一个非常有用的运算符。

解决方案可能比您想象的要简单得多。将全大写的“LEVEL”更改为“Level”并试一试。

您可能还想尝试其他替代方法:

  1. 将 CAST 替换为 CAST(TO_NUMBER(REGEXP_REPLACE(game_progress, 'Level ', '')) AS INTEGER)
  2. 使用 SPLIT_PART(string, delimiter, position) 而不是 REGEXP_REPLACE,像这样 CAST(SPLIT_PART(game_progress, ' ', 2) AS INTEGER)

这是我尝试使用 PostgreSQL 的方法:

当然,您的查询要复杂得多,但想法就在那里。看看当我尝试使用全大写的 'LEVEL' 时会发生什么。

有时错误消息会产生误导,这就是为什么您很难找到查询的问题所在。

重要提示: 我的另一个建议是你应该重组你的专栏。例如,“级别”列在每一行都定义了“级别”。您可以简单地拥有一个名为“级别”的列 接受整数,然后用整数插入/更新。然后,您的所有查询都可以工作,而无需复杂的运算符。

我希望这会有所帮助。

祝你有美好的一天!

【讨论】:

  • 我认为重要的一点是答案中最重要的一点。如果它真的是一个整数,为什么要将游戏关卡存储为字符串。如果您必须将其显示为“Level xx”,则只需在需要时构建该字符串。
  • @PaulPalmpje 用例驱动的列类型的前期设计和与输出格式的解耦肯定会避免这样的麻烦。但有时 DB 用户(此处询问)没有这样做的权限(例如,第三方托管或只读数据库)。请对问题发表评论,这可能是解决方案。
【解决方案3】:

RegEx 默认区分大小写,切换到REGEXP_REPLACE(game_progress, 'LEVEL ', '', 1, 1, 'i') 使其不区分大小写。

如果仍然失败,您将获得其他非数字数据。用这个找到它:

SELECT DISTINCT game_progress
FROM point_review.vw_ft_level_progress a
where TO_NUMBER(REGEXP_REPLACE(game_progress, 'LEVEL ', '', 1, 1, 'i')) IS NULL

TO_NUMBER 为错误数据返回 NULL 而不是失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多