2009-06-30 13 views
28

Ho una tabella in un database SQL Server con una colonna NTEXT. Questa colonna può contenere dati racchiusi tra virgolette. Quando chiedo questa colonna, voglio rimuovere queste citazioni iniziali e finali.Come posso rimuovere preventivi iniziali e finali in SQL Server?

Ad esempio:

"questo è un messaggio di prova"

dovrebbe diventare

questo è un messaggio di prova

So delle funzioni LTRIM e RTRIM ma questi funzionano solo per gli spazi. Qualche suggerimento su quali funzioni posso usare per ottenere questo.

+0

Quale versione di SQL Server si sta utilizzando? –

+0

SQL Server 2005 – adeel825

risposta

2

si potrebbe sostituire le virgolette con una stringa vuota ...

SELECT AllRemoved = REPLACE(CAST(MyColumn AS varchar(max)), '"', ''), 
     LeadingAndTrailingRemoved = CASE 
      WHEN MyTest like '"%"' THEN SUBSTRING(Mytest, 2, LEN(CAST(MyTest AS nvarchar(max)))-2) 
      ELSE MyTest 
      END 
FROM MyTable 
+0

potrebbero esserci delle virgolette all'interno della stringa e non voglio rimuoverle - solo le virgolette iniziali e finali. – adeel825

+0

ha aggiornato l'esempio a un'istruzione case per rimuovere solo il lead e il trailing quando entrambi sono presenti. –

48

Ho appena testato questo codice in MS SQL 2008 e convalidato.

Remove più a sinistra citazione:

UPDATE MyTable 
SET FieldName = SUBSTRING(FieldName, 2, LEN(FieldName)) 
WHERE LEFT(FieldName, 1) = '"' 

Rimuovere più a destra citazione: (riveduta per evitare errori di conversione di tipo implicita a int)

UPDATE MyTable 
SET FieldName = SUBSTRING(FieldName, 1, LEN(FieldName)-1) 
WHERE RIGHT(FieldName, 1) = '"' 
+0

Questo è corretto, è anche possibile utilizzare le funzioni SINISTRA e DESTRA. – tekBlues

+1

colonna ntext, quindi LEN, LEFT e RIGHT non funzioneranno. Dovresti invece passare a DataLength e SubString. –

+0

SUBSTRING è la funzione in SQL Server. Non SUBSTR – Keltex

0

Si può provare a questo-

SELECT left(right(cast(SampleText as nVarchar),LEN(cast(sampleText as nVarchar))-1),LEN(cast(sampleText as nVarchar))-2) 
    FROM TableName 

evviva

18

Ho pensato che questo è uno script semplice se si desidera rimuovere tutte le citazioni

UPDATE Table_Name 
SET col_name = REPLACE(col_name, '"', '') 
+0

Questo è il modo in cui lo faccio. –

+9

Ha chiesto solo di rimuovere le virgolette iniziali e finali , questa soluzione sostituisce tutte le virgolette ... – WowtaH

+0

questo ha funzionato per me. volevo rimuovere tutte le virgolette – Taie

3

So che questo è un messaggio di domanda più vecchio, ma mia figlia è venuto da me con la domanda, e fatto riferimento questa pagina come avere possibili risposte. Dato che sta cercando una risposta per questo, è un presupposto sicuro che altri potrebbero ancora essere.

Tutti sono ottimi approcci e, come per ogni cosa, ci sono tanti modi per scuoiare un gatto quanti sono i gatti per la pelle.

Se siete alla ricerca di un sinistro assetto e un diritto assetto di un carattere o una stringa, e tuo carattere finale/string è uniforme di lunghezza, ecco il mio suggerimento:

SELECT SUBSTRING(ColName,VAR, LEN(ColName)-VAR) 

Or in questa domanda ...

SELECT SUBSTRING('"this is a test message"',2, LEN('"this is a test message"')-2) 

Con questo, è sufficiente regolare il punto di partenza SUBSTRING (2), e la posizione LEN (-2) a qualsiasi valore è necessario rimuovere dalla stringa.

È non iterativo e non richiede test esplicito caso e soprattutto è linea i quali fanno per un piano di esecuzione più pulito.

+0

Inoltre cercavo una risposta a questo, e usando mysql e ho dovuto sostituire LEN con LENGTH, ma per il resto questa risposta era perfetta per me. – Kieran

2

Si può semplicemente utilizzare la funzione "Sostituisci" in SQL Server.

come questo ::

select REPLACE('this is a test message','"','') 

nota: secondo parametro è qui "virgolette doppie" all'interno di due apici e terzo parametro è semplicemente una combinazione di due apici. L'idea qui è di sostituire le virgolette doppie con uno spazio vuoto.

Molto semplice e facile da eseguire!

+0

La migliore risposta qui. –

2

Il seguente script rimuove le virgolette solo attorno al valore della colonna se la tabella è denominata [Messaggi] e la colonna è denominata [Descrizione].

-- If the content is in the form of "anything" (LIKE '"%"') 
-- Then take the whole text without the first and last characters 
-- (from the 2nd character and the LEN([Description]) - 2th character) 

UPDATE [Messages] 
SET [Description] = SUBSTRING([Description], 2, LEN([Description]) - 2) 
WHERE [Description] LIKE '"%"' 
2

La mia soluzione è quella di utilizzare la differenza di lunghezza valori della colonna rispetto della stessa lunghezza della colonna, ma con le doppie virgolette sostituite con spazi e tagliati al fine di calcolare i valori di inizio e lunghezza come parametri in funzione SUBSTRING .

Il vantaggio di farlo in questo modo è che è possibile rimuovere qualsiasi carattere iniziale o finale anche se si verifica più volte lasciando tutti i caratteri contenuti nel testo.

Ecco la mia risposta con alcuni dati di test:

SELECT 
    x AS before 
    ,SUBSTRING(x 
     ,LEN(x) - (LEN(LTRIM(REPLACE(x, '"', ' ')) + '|') - 1) + 1 --start_pos 
     ,LEN(LTRIM(REPLACE(x, '"', ' '))) --length 
     ) AS after 
FROM 
(
SELECT 'test'  AS x UNION ALL 
SELECT '"'  AS x UNION ALL 
SELECT '"test' AS x UNION ALL 
SELECT 'test"' AS x UNION ALL 
SELECT '"test"' AS x UNION ALL 
SELECT '""test' AS x UNION ALL 
SELECT 'test""' AS x UNION ALL 
SELECT '""test""' AS x UNION ALL 
SELECT '"te"st"' AS x UNION ALL 
SELECT 'te"st' AS x 
) a 

che produce i seguenti risultati:

before after 
----------------- 
test test 
" 
"test test 
test" test 
"test" test 
""test test 
test"" test 
""test"" test 
"te"st" te"st 
te"st te"st 

Una cosa da notare che quando ottiene la lunghezza Ho solo bisogno di usare LTRIM e non LTRIM e RTRIM combinati, questo perché la funzione LEN non conta gli spazi finali.

0

Io uso questo:

UPDATE DataImport 
SET PRIO = 
     CASE WHEN LEN(PRIO) < 2 
     THEN 
      (CASE PRIO WHEN '""' THEN '' ELSE PRIO END) 
     ELSE REPLACE(PRIO, '"' + SUBSTRING(PRIO, 2, LEN(PRIO) - 2) + '"', 
      SUBSTRING(PRIO, 2, LEN(PRIO) - 2)) 
     END 
0

Per rimuovere entrambe le citazioni si potrebbe fare questo

SUBSTRING(fieldName, 2, lEN(fieldName) - 2) 

è possibile assegnare o proiettare il valore risultante

0

È possibile utilizzare seguente interrogazione, che ha funzionato per me-

Per l'aggiornamento-

UPDATE table SET colName= REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') WHERE... 

Per selecting-

SELECT REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') FROM TableName 
2

Alcuni UDF per riutilizzabilità.

sinistra Taglio per carattere (qualsiasi numero)

CREATE FUNCTION [dbo].[LTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',') 
RETURNS NVARCHAR(max) 
AS 
BEGIN 
     RETURN REPLACE(REPLACE(LTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ') 
END 

destro Taglio per carattere (qualsiasi numero)

CREATE FUNCTION [dbo].[RTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',') 
RETURNS NVARCHAR(max) 
AS 
BEGIN 
    RETURN REPLACE(REPLACE(RTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ') 
END 

Nota il carattere fittizio '|' (Alt + 0166) non possono essere presenti in i dati (potresti voler testare la tua stringa di input, in primo luogo, se non sei sicuro o utilizzare un carattere diverso).

+0

Bel codice più uno! –

Problemi correlati