【问题标题】:CONCAT() using a date variable, which is converted into a character using to_char, and two other string variablesCONCAT() 使用日期变量,使用 to_char 转换为字符,以及另外两个字符串变量
【发布时间】:2021-06-21 14:14:50
【问题描述】:

这是我第一次使用 SQL Developer。 我想创建一个字符串变量,其中包含字符串todate2portfolionode_name 的组合值。但是,当我尝试在 concat 函数中包含 todate2 时,我得到一个错误。 DATA_TYPE:to_date 是 DATE,portfolio 是 VARCHAR2(15 CHAR),node_name 是 VARCHAR2(15 CHAR)

返回错误的代码:

select to_char(to_date, 'ddmmyyyy') todate2, to_char(to_date, 'dd-mm-yyyy') todate, 
concat(concat(**todate2**,portfolio),node_name) as comb,
 portfolio, node_name,
 node_no, 
 sort
FROM table1
WHERE 1=1


ORDER BY 
  to_date asc,
  node_no asc
  ;  

或者,我尝试过:

select  to_char(to_date, 'dd-mm-yyyy') todate, 
concat(concat(**to_char(to_date, 'ddmmyyyy')**,portfolio),node_name) as comb,
 portfolio, node_name,
 node_no, 
 sort
FROM table1
WHERE 1=1


ORDER BY 
  to_date asc,
  node_no asc
  ;  

这是我第一次询问有关 SQL 的问题。如果我提供的信息不充分,请随时询问更多信息。 提前谢谢你。

【问题讨论】:

  • 您遇到什么错误?第一个会抱怨,因为你不能在同一级别的查询中使用列别名,除了 order-by,所以 todate2 是一个无效的标识符。第二个看起来不错 - 尽管使用函数名作为列名会令人困惑。

标签: sql concatenation oracle-sqldeveloper


【解决方案1】:

不要使用CONCAT,它在Oracle 中只接受两个参数。请改用双管道|| 连接运算符:

select to_char(todate2, 'ddmmyyyy') || ' '|| portfolio ||' '|| node_name
from table1
where ...

【讨论】:

    【解决方案2】:

    在您的第一个查询中,您将todate2 定义为列表达式的别名。您不能在同一级别的查询中使用别名,除了在 order by 子句中;这是由于处理和评估 SQL 的顺序。因此该查询将得到错误“ORA-00904:“TODATE2”:无效标识符”。

    如果您有一个复杂的计算或表达式,那么您可以使用子查询(即内联视图或公用表表达式,也称为子查询分解)来定义别名,然后外部查询可以使用该别名。这似乎有点矫枉过正。

    您的第二个查询按原样工作,但您可以按照@Littlefoot 的建议切换到串联运算符:

    select  to_char(to_date, 'dd-mm-yyyy') todate, 
      to_char(to_date, 'ddmmyyyy') || portfolio || node_name as comb,
    ...
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2015-04-18
      相关资源
      最近更新 更多