查询模式***,从SQL输出,不使用dual



这个问题是在一次采访中问的:

需要使用SQL打印以下模式。SQL不应该溶液中的CCD_ 1。

*
* *
* * *

我给出的答案如下:

select lpad(' ',level,'*') from dual
connect by level <= 3;

另一个问题也有同样的概念,垂直打印我的名字,如下所示。

M
A
N
A
S
I

没有dual,我们如何打印这些?

替换DUAL的一个选项是从任何至少有一行的表/视图中进行选择,然后选择WHERE ROWNUM = 1。在下面的查询中,我使用的是ALL_OBJECTS视图。

SELECT LPAD ('*', LEVEL, '*')
FROM (SELECT 1
FROM all_objects
WHERE ROWNUM = 1)
CONNECT BY LEVEL <= 3;

LPAD('*',LEVEL,'*')
______________________
*
**
***

对于第二个问题,您可以使用类似的解决方案,即使用任何至少有一行的表/视图,并从中进行选择。另一个厚颜无耻的解决方案是用SYS.ODCIVARCHAR2LIST只写下你的名字。下面的两个查询都会给出相同的结果。

--Query 1
SELECT SUBSTR (your_name, LEVEL, 1)     AS letters
FROM (SELECT 'MANASI'     AS your_name
FROM all_objects
WHERE ROWNUM = 1)
CONNECT BY LEVEL <= LENGTH (your_name);
--Query 2 (Cheeky solution)
SELECT COLUMN_VALUE     AS letters
FROM TABLE (sys.odcivarchar2list ('M',
'A',
'N',
'A',
'S',
'I'));
--Result of both queries
LETTERS
__________
M
A
N
A
S
I

只需使用任何其他表并将其限制为一行:

WITH rsqfc ( value ) AS (
SELECT '*' FROM all_tables WHERE ROWNUM = 1
UNION ALL
SELECT value || ' *'
FROM   rsqfc
WHERE  LENGTH(value) <= 5
)
SELECT value
FROM   rsqfc;

或者:

SELECT '*' AS value FROM all_tables WHERE ROWNUM = 1
UNION ALL
SELECT * FROM (SELECT '* *' FROM all_objects FETCH FIRST ROW ONLY)
UNION ALL
SELECT '* * *' FROM (
SELECT ROW_NUMBER() OVER (ORDER BY ROWNUM) AS rn FROM all_tab_columns
)
WHERE rn = 1;

或者,将其限制为所需的行数:

SELECT SUBSTR('* * *', 1, 2 * ROWNUM - 1) AS value
FROM   all_tables
WHERE  ROWNUM <= 3;

所有输出:

VALUE
*
**
***

有趣的是,第一个问题就像我回答的Code Golf问题(链接)

我唯一能想到的是从系统的角度进行选择,而不是双重选择。

SELECT LPAD('*', ROWNUM, '*')
FROM all_objects ao
WHERE ROWNUM <= 3;

第二个:

SELECT SUBSTR('MANASI', ROWNUM, 1)
FROM all_objects ao
WHERE ROWNUM <= LENGTH('MANASI');

您可以在xmltable()中使用XQuery表达式作为行生成器:

select rpad('*',rownum,'*')
from   xmltable('1 to 3');
select substr('MANASI',rownum,1)
from   xmltable('1 to 5'));

DBFiddle

最新更新