我有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次活动状态,并且可以在一个表达式中检查整个活动状态?
如何在不创建存储过程的情况下在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) 自从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) 下面的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) 我有一张名为"人"的桌子.它包含person的id和它的父id(只有一个父级是可能的).作为查询的结果,我想要一个包含第一列的表 - 一个人ID,第二列 - 一个包含它的子ID的列表.怎么做到这一点?我已经阅读过listagg函数,但我不确定它是否适合我的目的.此查询生成一个空的第二列:
从人t1中选择t1.id,(从人t2中选择t2.id,其中t2.parent_id = t1.id),其中t1.status ='parent';
我想使用找到的数字替换文件中的某些数字和计算结果,并喜欢在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) 我有一个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,有
对于批次2,有
有没有办法在一个查询中执行此操作,而无需为每个状态代码重写查询?即我可以轻松编写这样的查询,并运行三次:
SELECT batch, COUNT(status)
FROM table
WHERE status = 0
GROUP BY batch
Run Code Online (Sandbox Code Playgroud)
我可以运行它,然后再次运行status = 1,再次运行status = 2,但我希望在一个查询中执行它.
如果它有所不同,除了STATUS列之外还有另一列我可能想要以相同的方式进行汇总 - …