小编Rob*_*ijk的帖子

CASE .. WHES中的表达式

我有1列的表,并有以下数据

Status
a1
i
t
a2
a3
Run Code Online (Sandbox Code Playgroud)

我想在我的选择查询中显示以下结果

Status| STATUSTEXT
a1    | Active
i     | Inactive
t     | Terminated
a2    | Active
a3    | Active
Run Code Online (Sandbox Code Playgroud)

我能想到的一种方法是在select查询中使用Switch When表达式

SELECT
status,
CASE status 
WHEN 'a1' THEN 'Active'
WHEN 'a2' THEN 'Active'
WHEN 'a3' THEN 'Active'
WHEN 'i' THEN 'Inactive'
WHEN 't' THEN 'Terminated'
END AS StatusText
FROM stage.tst
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点,我不需要写入当表达3次活动状态,并且可以在一个表达式中检查整个活动状态?

sql oracle oracle10g

68
推荐指数
4
解决办法
59万
查看次数

如何在不创建存储过程的情况下将多行连接成Oracle中的一行?

如何在不创建存储过程的情况下在oracle中实现以下功能?

数据集:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12
Run Code Online (Sandbox Code Playgroud)

期望的结果:

question_id    element_id
1              7,8
2              9
3              10,11,12
Run Code Online (Sandbox Code Playgroud)

sql oracle concatenation string-aggregation

55
推荐指数
3
解决办法
23万
查看次数

使用递归子查询因子进行循环检测

自从v2以来,Oracle SQL可以使用其专有的CONNECT BY语法进行分层查询.在他们最新的11g版本2中,他们添加了递归子查询因子,也称为recursive with子句.这是ANSI标准,如果我理解正确,这个也已由其他RDBMS供应商实现.

将connect-by与递归with进行比较时,我注意到使用循环检测时结果集的差异.结果连接对我来说更直观,所以我想知道Oracle的实现是否包含错误,或者这是否是标准ANSI和预期行为.因此,我的问题是,如果您可以使用其他数据库(如MySQL,DB2,SQL Server等)检查递归查询.如果这些数据库当然支持recursive with子句.

以下是它在Oracle 11.2.0.1.0上的工作原理

SQL> select *
  2    from t
  3  /

        ID  PARENT_ID
---------- ----------
         1          2
         2          1

2 rows selected.
Run Code Online (Sandbox Code Playgroud)

使用CONNECT BY语法的查询:

SQL>  select id
  2        , parent_id
  3        , connect_by_iscycle
  4     from t
  5  connect by nocycle parent_id = prior id
  6    start with id = 1
  7  /

        ID  PARENT_ID CONNECT_BY_ISCYCLE
---------- ---------- ------------------
         1          2                  0
         2          1                  1

2 rows selected.
Run Code Online (Sandbox Code Playgroud)

这看起来很直观.但是,使用新的ANSI语法,它会再返回一行:

SQL> with tr (id,parent_id) as
  2 …
Run Code Online (Sandbox Code Playgroud)

sql oracle db2 hierarchical-query

22
推荐指数
2
解决办法
2万
查看次数

为什么dbms_sql.parse包含带有绑定变量的错误PL/SQL块意外成功?

下面的PL/SQL块按预期失败:

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(''a''); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  /
declare
*
FOUT in regel 1:
.ORA-06550: Regel 1, kolom 7:
PLS-00201: identifier 'DONTEXIST' must be declared.
ORA-06550: Regel 1, kolom 7:
PL/SQL: Statement ignored.
ORA-06512: in "SYS.DBMS_SQL", regel 1120
ORA-06512: in regel 5
Run Code Online (Sandbox Code Playgroud)

因为我没有名为DONTEXIST的程序.我的问题是为什么下一个PL/SQL块成功完成?

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(:a); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  / …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bind-variables

5
推荐指数
1
解决办法
268
查看次数

由于Oracle中的select语句而以逗号分隔的列表

我有一张名为"人"的桌子.它包含person的id和它的父id(只有一个父级是可能的).作为查询的结果,我想要一个包含第一列的表 - 一个人ID,第二列 - 一个包含它的子ID的列表.怎么做到这一点?我已经阅读过listagg函数,但我不确定它是否适合我的目的.此查询生成一个空的第二列:

从人t1中选择t1.id,(从人t2中选择t2.id,其中t2.parent_id = t1.id),其中t1.status ='parent';

sql oracle subquery string-aggregation

4
推荐指数
1
解决办法
1万
查看次数

使用sed替换数字

我想使用找到的数字替换文件中的某些数字和计算结果,并喜欢在MacOSX上使用sed.我尝试了很多变种,现在知道我必须使用-E来使用现代而不是基本的正则表达式.

一些例子:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed s/\ +\ wwv_flow_id.offset/blabla/
Run Code Online (Sandbox Code Playgroud)

bla 18934750blabla bla
Run Code Online (Sandbox Code Playgroud)

因此,如果没有-E,它会找到并替换固定文本.但是使用-E,它不会:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ +\ wwv_flow_id.offset/blabla/
Run Code Online (Sandbox Code Playgroud)

bla 18934750 + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)

换句话说:文本中没有匹配也没有变化.最终目标是找到固定文本"+ wwv_flow_id.offset"之前的数字并使用该数字并从中减去固定数字(比如750),因此最终结果变为:

bla 18934000 + wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)

为此,我至少需要返回引用,这也不像我预期的那样工作,因为

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\1/
Run Code Online (Sandbox Code Playgroud)

bla 1+ wwv_flow_id.offset bla
Run Code Online (Sandbox Code Playgroud)

我希望一些正则表达的大师可以帮助我.


UPDATE

在ruakh的帮助下,这就是我现在所拥有的:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) \+ wwv_flow_id.offset/(\1-750) \+ wwv_flow_id.offset/'
Run Code Online (Sandbox Code Playgroud)

返回:

bla (18934750-750) …
Run Code Online (Sandbox Code Playgroud)

regex macos sed

4
推荐指数
1
解决办法
3万
查看次数

Oracle SQL查询使用GROUP BY汇总统计信息

我有一个Oracle表,其数据如下所示:

ID   BATCH   STATUS
1    1       0
2    1       0
3    1       1
4    2       0
Run Code Online (Sandbox Code Playgroud)

也就是说,ID是主键,每个"批处理"将有多行,每行在STATUS列中都有一个状态代码.还有很多其他专栏,但这些是重要的专栏.

我需要编写一个查询来汇总每个批次状态代码 ; 在STATUS列中有三个可能的值,0,1和2,我希望输出看起来像这样:

BATCH  STATUS0  STATUS1  STATUS2
1      2        1        0
2      1        0        0
Run Code Online (Sandbox Code Playgroud)

这些数字将是重要的; 对于批次1,有

  • STATUS设置为0的2条记录
  • 1记录STATUS设置为1,和
  • 没有STATUS设置为0的记录.

对于批次2,有

  • 1记录STATUS设置为0,和
  • 没有STATUS设置为1或2的记录.

有没有办法在一个查询中执行此操作,而无需为每个状态代码重写查询?即我可以轻松编写这样的查询,并运行三次:

SELECT batch, COUNT(status)
FROM table
WHERE status = 0
GROUP BY batch
Run Code Online (Sandbox Code Playgroud)

我可以运行它,然后再次运行status = 1,再次运行status = 2,但我希望在一个查询中执行它.

如果它有所不同,除了STATUS列之外还有另一列我可能想要以相同的方式进行汇总 - …

sql oracle pivot group-by

2
推荐指数
1
解决办法
7448
查看次数