【问题标题】:How to replace date value in SQL?如何替换 SQL 中的日期值?
【发布时间】:2020-03-28 10:16:12
【问题描述】:

我正在使用 Oracle 并尝试创建一个视图,我将在其中将一个日期值替换为另一个日期值。我正在尝试使用case when 语句,但是,我需要使用相同的列名作为别名,并且我得到了我有重复列名的错误。您是否知道如何修复它或提出替代列中的日期值并创建视图的替代方法?我需要保持原表不变。 代码:

create view name_of_view as
select t.*,
(case when birth_date = to_date('4.12.2015', 'DD.MM.YYYY')
 then to_date('4.12.1950', 'DD.MM.YYYY')
 else birth_date end) as birth_date
 from table t;

【问题讨论】:

  • t.* 是一种反模式。使用完整的列列表。 Oracle 不支持SELECT * EXCEPT/REPLACE syntax
  • 还有其他选项不需要使用完整的列列表吗?我的表大约有 100 列。
  • 我不坚持使用case语句进行替换,我只需要创建视图而不更改现有表。
  • SELECT col1, col2, ... 你不需要手写。只需从对象资源管理器中拖放(如果您使用的是 SQL Developer)

标签: sql oracle date case sql-view


【解决方案1】:

正如@Lukasz Szozda 在 cmets 中所建议的,当您尝试t.* 时,它将从您的表中检索所有列,包括birth_date。 因此,当您添加另一个 birth_date 作为 case when 的一部分时,您会收到重复列名错误。

你需要做的是:

  • 您可以将 case when 列名称更改为:birth_date_new 或其他任何内容,然后您将拥有这两个列。
  • 您按名称检索所有列,并在检索birth_date 时应用case when

【讨论】:

  • 我需要为视图保留相同的列名:birth_date,只需更改其中的值即可。所以除了case when 之外没有其他替换选项可以让我为视图替换它?
  • 例如,以与更新表相同的方式更新视图?
  • 不列出所有列 - 我想避免超长查询
  • 事实上不,您要么选择 (*),要么选择细节。 stackoverflow.com/a/9133172/8943967 或者如果必须的话,你可以写一个pl/sql块,做很多查询来实现你想要的。
  • @doremi 用作“Birth_Date”,然后通过保留星号为 case 语句起别名。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2019-03-04
  • 1970-01-01
  • 2021-11-20
  • 2017-05-10
  • 2022-08-15
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多