web-dev-qa-db-de.com

So entfernen Sie ein bestimmtes Zeichen aus einer Zeichenfolge nur dann, wenn es das erste oder letzte Zeichen in der Zeichenfolge ist.

Angenommen, ich habe einen String 1,2,3,. Ich möchte den letzten , entfernen, oder wenn der String ,1,2,3, oder ,1,2,3 aussieht, möchte ich trotzdem 1,2,3 als Ergebnis erhalten. Und bitte versuchen Sie in Ihrer Antwort ein wenig erklärend zu sein. Ich möchte nicht einfach Einfügungen kopieren, ohne es zu verstehen. Vielen Dank.

12
Arbaaz

Eine Möglichkeit, solche "Kommas" zu verwenden, wäre die Verwendung einer CASE-Anweisung:

CASE
    WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2)
    WHEN str LIKE ',%'  THEN RIGHT(str, LEN(str)-1)
    WHEN str LIKE '%,'  THEN LEFT(str, LEN(str)-1)
    ELSE str
END

Dies ist sehr selbsterklärend: Die CASE-Anweisung berücksichtigt drei Situationen:

  • Wenn der String str auf beiden Seiten Kommas hat,
  • Wenn der String str in einem Komma beginnt, aber nicht in einem, und endet
  • Wenn der String str in einem Komma endet, aber nicht in einem beginnt.

Im ersten Fall werden das erste und das letzte Zeichen entfernt. Im zweiten Fall wird das Zeichen ganz links entfernt. Im letzten Fall wird das nachfolgende Zeichen entfernt.

Demo auf sqlfiddle.

20
dasblinkenlight
declare @str varchar(20)=',1,2,3,'

select   case
         when @str like ',%,' then stuff(stuff(@str, 1, 1, ''),LEN(stuff(@str, 1, 1, '')),1,'')

         when @str like ',%' then stuff(@str, 1, 1, '')

         when @str like '%,' then stuff(@str, LEN(@str), 1, '')

         else @str
         end
1
Poonam

Versuche dies. REVERSE (SUBSTRING (REVERSE (fld), 2, LEN (fld))) Es wird immer das letzte Zeichen verwendet .. .. Sie können eine CASE WHEN-Anweisung verwenden, um sicherzustellen, dass das letzte Zeichen ein Komma ist FALL BEI REVERSE (SUBSTRING (fld, 1,1)) = ',' DANN REVERSE (SUBSTRING (REVERSE (fld), 2, LEN (fld))) ELSE fld END fld

0
jneal

Wenn Sie nur ein nachfolgendes Komma entfernen möchten, würde ich in SQL Server die STUFF-Funktion verwenden, die ungefähr so ​​aussieht:

SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable
0
Ben82

Wenn Sie nur ein Komma (wie in Ihrer ursprünglichen Frage) am Anfang oder am Ende ersetzen müssen, gehen Sie wie folgt vor:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, IIF(LEFT(str,1)=',',2,1), 
                      LEN(str)-IIF(LEFT(str,1)=',',1,0)
                              -IIF(RIGHT(str,1)=',',1,0))
    ELSE str
END

Wenn ,,,,1,2,3,,,, möglich ist, verwenden Sie die Funktion PATINDEX () mit der Maske '%[0-9]%:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, PATINDEX('%[0-9]%',str), 
                      LEN(str)-(PATINDEX('%[0-9]%',str)-1)
                              -(PATINDEX('%[0-9]%',REVERSE(str))-1))
    ELSE str

END

SQLFiddle demo

0
valex

dept_name ist der Name der Spalte und 'I' ist ein Zeichen, das Sie ersetzen möchten.

SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like  '%I'
0
Poonam

CASE würde hier funktionieren. Ich denke so etwas:

CASE 

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 AND ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT MID(YourString, 2, LEN(YourString) - 2)

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1
THEN SELECT LEFT(YourString, LEN(YourString) -1)

WHEN ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT RIGHT(YourString, LEN(YourString) - 1)

ELSE SELECT YourString

END

Dies funktioniert unabhängig vom Zeichen, da geprüft wird, ob der erste und der letzte zuerst numerisch sind. Wenn nicht, wird die neue Zeichenfolge abgerufen. Andernfalls prüfen, ob das Ende numerisch ist, wenn nicht die Zeichenfolge neben dem Ende ausgewählt wird Prüfen Sie, ob der Anfang numerisch ist, wenn Sie die Zeichenfolge nicht auswählen, andernfalls erhalten Sie Ihre Zeichenfolge.

0
shadowjfaith

Einige Optionen, alle mit SQLCLR, wenn dies nicht der Zugriff ist. Sie können Ihre eigenen Funktionen schreiben, um diese Dinge auszuführen, aber die Beispiele, die ich zeigen werde, basieren auf der Bibliothek SQL # (SQLsharp) . Ich bin der Autor der SQL # -Bibliothek, aber die ersten beiden Beispiele verwenden Funktionen, die in der kostenlosen Version verfügbar sind. Das dritte Beispiel, das TrimChars () verwendet, ist nicht frei, aber ich habe es der Vollständigkeit halber beigefügt, da es so einfach war ;-). In jedem Beispiel können die Zeichen in den Vor- oder Nachkommastellen beliebig sein. 

  1. Ein etwas einfacher regulärer Ausdruck zur Verwendung in einer Capture-Gruppe, um alles vom ersten Nicht-Komma-Wert bis zum letzten Nicht-Komma-Wert abzurufen:

    SELECT SQL#.RegEx_CaptureGroup(N',,12,123,12334,567,,,,,',
                                   N'^,*(.+?),*$', -- Regular Expression
                                   1, -- Capture Group to return
                                   '', -- not found replacement
                                   1, -- Start At position
                                   -1, -- Length
                                   '' -- RegEx Options
                                   )
    
  2. Wenn der Grund für das Entfernen der zusätzlichen Kommas darin besteht, eine saubere Liste für das Aufteilen zu erhalten, können Sie sie teilen und die Auflösungsfunktion die leeren Werte entfernen, sodass Sie sich keine Gedanken darüber machen müssen, wo leere Werte sind, selbst wenn sie in der Mitte liegen:

    SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2)
    -- 2 = remove empty values
    
  3. Sie können einen einfachen Zuschnitt ausführen, der das angegebene Zeichen von beiden Seiten entfernt, bis ein Zeichen gefunden wird, das nicht das zu beschneidende Zeichen ist:

    SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
    
0
Solomon Rutzky