Ich bin auf diesen Thread gestoßen, als ich nach einer Lösung für mein ähnliches Problem gesucht habe, das genau die gleichen Anforderungen hatte, aber für eine andere Art von Datenbank war, der auch das fehlte REVERSE
Funktion .
In meinem Fall war dies für eine OpenEdge (Progress) -Datenbank, die eine etwas andere Syntax hat. Dies stellte INSTR
mir die Funktion zur Verfügung, die die meisten von Oracle typisierten Datenbanken bieten .
Also habe ich mir folgenden Code ausgedacht:
SELECT
INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/', ''))) AS IndexOfLastSlash
FROM foo
Für meine spezielle Situation (als OpenEdge (Progress) -Datenbank) führte dies jedoch nicht zum gewünschten Verhalten, da das Ersetzen des Zeichens durch ein leeres Zeichen dieselbe Länge wie die ursprüngliche Zeichenfolge ergab. Das macht für mich nicht viel Sinn, aber ich konnte das Problem mit dem folgenden Code umgehen:
SELECT
INSTR(foo.filepath, '/',1, LENGTH( REPLACE( foo.filepath, '/', 'XX')) - LENGTH(foo.filepath)) AS IndexOfLastSlash
FROM foo
Jetzt verstehe ich, dass dieser Code das Problem für T-SQL nicht lösen wird, da es keine Alternative zu der INSTR
Funktion gibt, die das bietetOccurence
Eigenschaft .
Um genau zu sein, füge ich den Code hinzu, der zum Erstellen dieser Skalarfunktion erforderlich ist, damit er auf die gleiche Weise wie in den obigen Beispielen verwendet werden kann.
-- Drop the function if it already exists
IF OBJECT_ID('INSTR', 'FN') IS NOT NULL
DROP FUNCTION INSTR
GO
-- User-defined function to implement Oracle INSTR in SQL Server
CREATE FUNCTION INSTR (@str VARCHAR(8000), @substr VARCHAR(255), @start INT, @occurrence INT)
RETURNS INT
AS
BEGIN
DECLARE @found INT = @occurrence,
@pos INT = @start;
WHILE 1=1
BEGIN
-- Find the next occurrence
SET @pos = CHARINDEX(@substr, @str, @pos);
-- Nothing found
IF @pos IS NULL OR @pos = 0
RETURN @pos;
-- The required occurrence found
IF @found = 1
BREAK;
-- Prepare to find another one occurrence
SET @found = @found - 1;
SET @pos = @pos + 1;
END
RETURN @pos;
END
GO
Um das Offensichtliche zu vermeiden, REVERSE
müssen Sie diese Skalarfunktion nicht erstellen , wenn die Funktion verfügbar ist, und Sie können einfach das gewünschte Ergebnis wie folgt erhalten:
SELECT
LEN(foo.filepath) - CHARINDEX('/', REVERSE(foo.filepath))+1 AS LastIndexOfSlash
FROM foo