|
|
原来又是字符串长度的故障,加了CAST就好了:
WITH t (n,bit) AS (
SELECT 0,CAST('0' AS VARCHAR2(100)) FROM DUAL
UNION ALL
SELECT n+1
,(NVL(RTRIM(bit,'1'),'0')+1)||RPAD('0',LENGTH(bit)-INSTR(bit,'0',-1),'0')
FROM t
WHERE n<9999
)
SELECT SUM(LENGTH(bit)) total
,SUM(LENGTH(bit)-NVL(LENGTH(REPLACE(bit,'1')),0)) zero
,SUM(LENGTH(bit)-NVL(LENGTH(REPLACE(bit,'0')),0)) one
FROM t;
TOTAL ZERO ONE
---------- ---------- ----------
123618 64608 59010
MODEL中的CASE也可以简化一下:
SELECT SUM(LENGTH(bit)) total
,SUM(LENGTH(bit)-NVL(LENGTH(REPLACE(bit,'1')),0)) zero
,SUM(LENGTH(bit)-NVL(LENGTH(REPLACE(bit,'0')),0)) one
FROM ( SELECT n
,bit
FROM (SELECT 0 n,CAST('0' AS VARCHAR2(100)) bit FROM DUAL)
MODEL RETURN ALL ROWS
DIMENSION BY (n)
MEASURES (bit)
RULES (
bit[FOR n FROM 1 TO 9999 INCREMENT 1] = (NVL(RTRIM(bit[cv()-1],'1'),'0')+1)||RPAD('0',LENGTH(bit[cv()-1])-INSTR(bit[cv()-1],'0',-1),'0')
)
)
; |
|