【问题标题】:First CAST then concatenate (||) in Firebird首先 CAST 然后在 Firebird 中连接 (||)
【发布时间】:2021-07-02 17:06:22
【问题描述】:

如何在 Firebird 中投射然后将元素连接在一起?

SELECT 
ARTICLE_NAME ||','||CAST 
FROM 
(select cast(QUANTITY as varchar(50)) from PREORDER_ITEM)

我也试过

with DATA as ( select cast(QUANTITY as varchar(50) ) from PREORDER_ITEM )
 SELECT 
    ARTICLE_NAME ||','||QUANTITY
FROM 
    DATA

为什么这不起作用?

【问题讨论】:

  • 欢迎来到stackoverflow。当你说“不起作用”时——这是什么意思?你看到了什么错误,你认为他们想告诉你什么?
  • 你为什么还要打字 QUANTITY ?让它自动投射,SELECT ARTICLE_NAME || ', ' || QUANTITY FROM ...

标签: sql casting concatenation firebird


【解决方案1】:

您的查询存在多个问题:

  1. 当您执行select cast(QUANTITY as varchar(50) ) from PREORDER_ITEM 时,派生表中只有一 (1) 列。换句话说,两个查询中都没有ARTICLE_NAME
  2. 对于派生表或公用表表达式的选择表达式,所有列都必须具有明确的列名。因此,对于表达式,您需要使用 (AS <alias>) 指定显式别名。换句话说,您的第一个查询中没有列 CAST,第二个查询中也没有列 QUANTITY
  3. CAST 是一个保留字,因此当用作第​​一个查询中的列名时,它必须用双引号分隔。

所以,使用:

select article_name || quantity
from (
  select article_name, cast(quantity as varchar(50)) as quantity
  from preorder_item
)

with data as (
  select article_name, cast(quantity as varchar(50)) as quantity
  from preorder_item
)
select article_name || quantity
from data

顺便说一句,您不需要显式转换。在连接值时,Firebird 会自动强制转换为字符串值,所以你也可以使用:

select article_name || quantity 
from preorder_item

【讨论】:

  • 您能否详细说明一下主题 2. 别名 ` with data as ( select article_name || quantity from preorder_item ) select * from data `
  • @MichaelPietzsch 使用派生表时,所有列都必须有名称,如果只有表达式,则列没有名称(在顶级查询中,名称将生成,但不在派生表和子查询中)。因此,您需要通过使用 <expression> [AS] <alias> 的别名来指定名称(AS 是可选的,但为了便于阅读,最好始终使用它)。
  • @MichaelPietzsch 如果我的回答帮助您解决了问题,请点击复选标记接受。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多