2012-01-13 14 views
6

¿Hay alguna manera de reemplazar la primera instancia de un carácter en una cadena con algo, por ejemplo.Reemplazar solo la enésima instancia del carácter

^1402 WSN NIAMLAB^teertS htimS 005 

ser

&1402 WSN NIAMLAB^teertS htimS 005 

mantener el segundo lugar en^

+3

Has hecho muchas preguntas, las personas que han contestado. Contribuya diciéndonos qué respuesta funciona para usted. Para cada una de sus preguntas pasadas, marque una de las respuestas. –

Respuesta

21

Para volver a colocar la primera instancia de un personaje que recomendaría el uso de los STUFF y CHARINDEX funciones. STUFF inserta una cadena en otra cadena. Elimina una longitud especificada de caracteres en la primera cadena en la posición inicial y luego inserta la segunda cadena en la primera cadena en la posición de inicio.

DECLARE @str varchar(100) = '^1402 WSN NIAMLAB^teertS htimS 005' 
SELECT STUFF(@str, CHARINDEX('^', @str), 1, '&') 

Tenga en cuenta que también se puede utilizar STUFF en una consulta de la siguiente manera:

SELECT STUFF(<yourcolumn>, CHARINDEX('^', <yourcolumn>), 1, '&') 
FROM <yourtable> 
0

código no probado:

SELECT STUFF('^1402 WSN NIAMLAB^teertS htimS 005', charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005'), 1, '&'); 
GO 

Sin embargo, si el personaje no existe, que se quiere rodear eso con un si/entonces en charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005') != 0

2

Aunque el ejemplo en su pregunta es cómo reemplazar solo la primera ocurrencia de un char, su título indica que desea reemplazar el enésimo caso, que es un poco más complicado.

Escribí una función un tiempo atrás para encontrar la enésima ocurrencia de un personaje en una cadena. Podrías usar que construir una cuerda con SUBSTRING.

if exists (
    select 1 
    from dbo.sysobjects 
    where id = object_id(N'[dbo].[CHARINDEX3]') 
     and xtype in (N'FN', N'IF', N'TF')) 
begin 
    drop function [dbo].[CHARINDEX3] 
end 

GO 

/* 
Example: 
SELECT dbo.CHARINDEX3('a', 'abb abb a', 3) 
SELECT dbo.CHARINDEX3('b', 'abb abb a', 5) 
SELECT dbo.CHARINDEX3('a', 'abbabba', 3) 
SELECT dbo.CHARINDEX3('b', 'abbabba', 5) 
If @occurance > the max Occurrence, the function will return the max Occurrence 
*/ 

CREATE FUNCTION dbo.CHARINDEX3 
(
    @TargetStr char(1), 
    @SearchedStr varchar(max), 
    @Occurrence int 
) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @ret INT 

    ; WITH 
     -- Tally table Gen   Tally Rows:  X2    X3 
     t1 AS (SELECT 1 N UNION ALL SELECT 1 N), -- 4   , 8 
     t2 AS (SELECT 1 N FROM t1 x, t1 y),   -- 16   , 64 
     t3 AS (SELECT 1 N FROM t2 x, t2 y),   -- 256   , 4096 
     t4 AS (SELECT 1 N FROM t3 x, t3 y),   -- 65536  , 16,777,216 
     t5 AS (SELECT 1 N FROM t4 x, t4 y),   -- 4,294,967,296, A lot 
     Numbers AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) Num 
        FROM t3 x, t3 y) 
    SELECT TOP 1 @ret = Num 
    FROM 
    (
     SELECT Ident = ROW_NUMBER() OVER (ORDER BY N.Num), N.Num 
     FROM Numbers N 
     WHERE N.Num <= DATALENGTH(@SearchedStr) 
      AND SUBSTRING(@SearchedStr, N.Num, DATALENGTH(@TargetStr)) = @TargetStr 
    ) R 
    WHERE Ident <= @Occurrence 
    ORDER BY Ident DESC 

    RETURN @ret 
END 

GO 

El uso de esta función se puede obtener la ubicación de la ocurrencia de orden n y simplemente tirar de todos los caracteres antes y después de la ocurrencia, reemplazando el valor específico.

--Actual Code 
DECLARE @loc INT 
DECLARE @MyStr VARCHAR(200) 
DECLARE @replacement CHAR(1) 

SET @MySTr = '^1402 WSN NIAMLAB^teertS htimS 005' 
SET @replacement = '$' 
SELECT @loc = dbo.CHARINDEX3('^',@MyStr, 2) 

SELECT SUBSTRING(@myStr, 1, @loc-1) + @replacement + SUBSTRING(@MyStr, @loc + 1, LEN(@MyStr)[email protected]) 

En este ejemplo se reemplaza sólo el segundo ^ con $

Cuestiones relacionadas