Sql 使用select子句的一部分而不重写它

Sql 使用select子句的一部分而不重写它,sql,oracle11g,Sql,Oracle11g,我正在使用一个Oracle SQL数据库,我正在尝试计算字典中以X字母开头的术语的数量 我的问题是: SELECT Substr(Lower(Dict.Term),0,1) AS Initialchar, Count(Lower(Dict.Term)) FROM Dict GROUP BY Substr(Lower(Dict.Term),0,1) ORDER BY Substr(Lower(Dict.Term),0,1); 这个查询按预期工作,但我不太高兴的是,我必须重写GROU

我正在使用一个Oracle SQL数据库,我正在尝试计算字典中以X字母开头的术语的数量

我的问题是:

SELECT Substr(Lower(Dict.Term),0,1) AS Initialchar,
       Count(Lower(Dict.Term))
FROM Dict
GROUP BY Substr(Lower(Dict.Term),0,1)
ORDER BY Substr(Lower(Dict.Term),0,1);
这个查询按预期工作,但我不太高兴的是,我必须重写GROUPBY和ORDERBY子句中的长“Substr(Lower(Dict.Term),0,1)”。有没有办法重用我在“选择零件”中定义的零件


谢谢

您可以使用子查询。因为Oracle遵循SQL标准,
substr()
从1开始计数。虽然Oracle确实明确允许0(),但我发现它有误导性,因为“0”和“1”引用相同的位置

因此:


不直接。输出列只能在
ORDER BY
子句中引用,不能以任何其他方式使用。唯一的方法是将它变成一个子选择,但它不会更清晰,并且可能会导致性能问题

我更愿意这样做

with init as (
 select  substr(lower(d.term), 1, 1) as Initialchar
 from dict d)
select Initialchar, count(*)
from init
group by Initialchar
order by Initialchar;
与相反的意思相反,这使得查询更加清晰,并定义了自然秩序;尤其是在使用更多子查询时


我不知道性能注意事项,但有一些限制,例如不可能在另一个
with
子句中使用
with
子句:
ORA-32034:不支持使用with子句

您可以在order by子句中引用
initialChar
别名。但这仅仅是问题的一半,并且您不能在GROUPBY子句中引用它,因此它没有真正的帮助。
with init as (
 select  substr(lower(d.term), 1, 1) as Initialchar
 from dict d)
select Initialchar, count(*)
from init
group by Initialchar
order by Initialchar;