【问题标题】:Oracle SQL - SELECT CASE WHEN column = ( select statement)Oracle SQL - SELECT CASE WHEN 列 =(选择语句)
【发布时间】:2021-02-05 12:30:03
【问题描述】:

我想用 SQL case 表达式选择“up_year”。

如果我这样做没问题:

SELECT CASE WHEN column1  = '2020' then 'up_year' else 'past_year' else end ;

但是当尝试这样做时:不想每年都改变。

SELECT 
CASE WHEN column1  = (select extract(year from sysdate) from dual) 
then 'up_year' 
else 'past_year' else end ;

【问题讨论】:

  • 等式右边不需要“select ... from dual”。将其写为“当 column1 = extract(year from sysdate) 时的情况”
  • PL/SQL 与此有什么关系?您所展示的是纯 SQL。请理解 PL/SQL 不是“Oracle SQL”的别称。另外:普通 SQL 只有 case expressions,没有 case statements,而且实际上你帖子中的所有内容都是 case expressions。 (CASE statements 确实存在 - 在 PL/SQL 中!)我将编辑您的帖子以进行这些更正;如果我理解错了,你可以改回来。
  • 最重要的是:你的问题是什么,真的吗?您是否遇到错误,但您不明白为什么?这与子SELECT无关;相反,您在“end”之前有一个不正确的“else”。您在表达式中已经有了正确的“else”。最好不要使用子 SELECT,但这不是导致当前语句错误的原因。

标签: sql oracle case-when


【解决方案1】:

你可以使用with子句,例如

  with y as (select extract(year from sysdate) year from dual)
  SELECT CASE WHEN column1  = y.year then 'up_year' else 'past_year'  end from y -- and your table

公用表表达式 (CTE) 是一个命名的临时结果集,存在于单个语句的范围内,稍后可以在该语句中引用

您可以使用select into 将提取输出分成两个步骤,然后使用它

【讨论】:

  • 谢谢,但我可以像 a=select extract(year from sysdate) 一样,然后从 dual 中选择一个;
  • @ÖmerFaruk 您也可以选择存储在变量中
  • select into 是不需要的;尽管他似乎暗示了什么,但 OP 在 PL/SQL 中没有做任何事情。这一切看起来都像普通的 SQL。
  • @mathguy 我添加了因为他在标题的第一个字母中询问并写了 PLSQL
  • 明白了——这就是我编辑他的帖子以删除所有对 PL/SQL 的引用的原因。整个原始帖子非常清楚地表明它与 PL/SQL 无关。
【解决方案2】:

您只想匹配当前年份。然后一种选择是使用TO_CHAR(,'yyyy')

SELECT CASE
         WHEN column1 = TO_CHAR(sysdate,'yyyy') then
          'up_year'
         ELSE
          'past_year'
       END AS "My Year"
  FROM tab   

【讨论】:

  • 这几乎是对的。但是,如果我们给 OP 怀疑的好处,并且我们假设 COLUMN1 的数据类型是 NUMBER (因为他在尝试与一个数字进行比较),那么我们应该与一个数字进行比较。您可以将右侧包含在 TO_NUMBER 中,但 EXTRACT (YEAR FROM...) 更直接。
  • 谢谢@mathguy,我之前也想过(在TO_NUMBER() 内包装),但考虑到查询中的引用值('2020'),我不想把它和@ 搞砸987654325@(好像是多余的)
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 2015-02-11
  • 2020-01-27
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2021-04-18
相关资源
最近更新 更多