ठीक है, तो यहाँ तर्क का सार इस प्रकार किया जा सकता है:
- किसी दी गई संख्या में समान क्रमागत अंकों की सबसे लंबी श्रंखला ज्ञात कीजिए; और
- सही लौटें अगर वह सबसे लंबा मान> 5 अंक हो
सही?
तो, इसे क्रमागत अंकों की श्रृंखला में विभाजित करते हैं:
regress=> SELECT regexp_matches('666666689', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g');
regexp_matches
----------------
{6666666}
{8}
{9}
(3 rows)
फिर सबसे लंबे समय तक फ़िल्टर करें:
regress=>
SELECT x[1]
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
ORDER BY length(x[1]) DESC
LIMIT 1;
x
---------
6666666
(1 row)
... लेकिन वास्तव में, हम वास्तव में इसकी परवाह नहीं करते हैं, बस अगर कोई प्रविष्टि 5 अंकों से अधिक लंबी है, तो:
SELECT x[1]
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
WHERE length(x[1]) > 5;
EXISTS
. के रूप में उपयोग किया जा सकता है परीक्षण, उदा.
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
SELECT x[1]
FROM regexp_matches(n, '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x
WHERE length(x[1]) > 5
)
जो वास्तव में बहुत कुशल है और सही परिणाम (हमेशा अच्छा) लौटाता है। लेकिन इसे थोड़ा और सरल बनाया जा सकता है:
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
SELECT x[1]
FROM regexp_matches(n, '(0{6}|1{6}|2{6}|3{6}|4{6}|5{6}|6{6}|7{6}|8{6}|9{6})', 'g') x;
)
आप उसी का उपयोग कर सकते हैं WHERE
DELETE
. में क्लॉज ।