Dies funktioniert in SQL Server 2008 +. Das gleiche Konzept wird in Oracle funktionieren, Sie müssen nur ein paar Syntaxunterschiede wie SUBSTR anstelle von SUBSTRING hinzufügen. Hier ist ein kurzer Versuch, Oracle Syntax der Umwandlung:
CREATE GLOBAL TEMPORARY TABLE TempTable
(String VARCHAR(100)) ON COMMIT PRESERVE ROWS;
INSERT INTO TempTable (String) VALUES ('mississsipisssss');
INSERT INTO #TempTable (String) VALUES ('ssasdfs');
WITH cteTokens (String, IndexNum, Token, CharCount) AS (
SELECT
String
,1 as IndexNum
,SUBSTR(t.String,1,1) as Token
,CASE WHEN SUBSTR(t.String,1,1) = 's' THEN 1 ELSE 0 END As CharCount
FROM
#TempTable t
UNION ALL
SELECT
t.String
IndexNum + 1 as IndexNum
,SUBSTR(t.String,IndexNum + 1,1) as Token
,CASE WHEN SUBSTR(t.String,IndexNum + 1,1) = 's' THEN t.CharCount + 1 ELSE 0 END AS CharCount
FROM
#TempTable s
INNER JOIN cteTokens t
ON s.String = t.String
AND LENGTH(s.String) >= t.IndexNum + 1
)
SELECT
String
,MAX(CharCount)
FROM
cteTokens
GROUP BY
String
;
Und hier ist eine SQL-Server Version
CREATE TABLE #TempTable (String VARCHAR(100))
INSERT INTO #TempTable (String) VALUES ('mississsipisssss')
INSERT INTO #TempTable (String) VALUES ('ssasdfs')
;WITH cteTokens (String, IndexNum, Token, CharCount) AS (
SELECT
t.String
,1 as IndexNum
,SUBSTRING(t.String,1,1) as Token
,CASE WHEN SUBSTRING(t.String,1,1) = 's' THEN 1 ELSE 0 END As CharCount
FROM
#TempTable t
UNION ALL
SELECT
t.String
,IndexNum + 1 as IndexNum
,SUBSTRING(t.String,IndexNum + 1,1) as Token
,CASE WHEN SUBSTRING(t.String,IndexNum + 1,1) = 's' THEN t.CharCount + 1 ELSE 0 END As CharCount
FROM
#TempTable s
INNER JOIN cteTokens t
ON s.String = t.String
AND LEN(s.String) >= t.IndexNum + 1
)
SELECT
String
,MAX(CharCount)
FROM
cteTokens
GROUP BY
String
Es ist ein Recursive Common Table Expression [CTE]
, die die Zeichenfolge in Zeichen Token in der Reihenfolge der Index Position spaltet und Tests, um zu sehen, ob sie der Charakter sind, den Sie wünschen. Wenn das Token das Zeichen ist, dann baut es auf dem Zählwert vom vorherigen Token auf, wenn es ein Zeichen ist, also musst du nur die MAX()
des Ergebnisses nehmen und du hast deine Antwort.
Dies wird zumindest in Oracle fehlschlagen. Es gibt keine FROM-Klausel im ersten CTE, Oracle hat keine SUBSTRING-Funktion (es gibt eine SUBSTR-Funktion), das rekursive CTE muss eine Spaltenaliasliste haben ... Haben Sie die Abfrage in einem der RDBMS getestet? Wo kompiliert es ohne Fehler und gab die richtige Antwort? In jedem Fall ist der Beitrag eindeutig als Oracle gekennzeichnet und dies hat drei Oracle Fehler, die ich mit bloßem Auge in ein paar Sekunden sehen kann. Klares Defizit. – mathguy
einige der Kommentar war nützlich und ich habe meine Antwort aktualisiert. ja das funktioniert und es wurde getestet.Auf jeden Fall Stahl die Idee und Aufräumen für Orakel-Syntax – Matt
Es wurde in der Form getestet, die Sie ursprünglich gepostet? Und es hat funktioniert? "Ja wirklich?" – mathguy