这个问题是在一次采访中问的:
需要使用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