Je veux créer une fonction pour supprimer dasht (3-, 2-) d'intérêt dans cet exemple:

colonne:

1GBDDR3-1066-21
2GBDDR3-1066-21
3- 4GBDDR3-1066-414
1GBDDR3-1066-21
2-1GBDDR3-1066-21

Production:

1GBDDR3-1066-21
2GBDDR3-1066-21
4GBDDR3-1066-414
1GBDDR3-1066-21
1GBDDR3-1066-21
1
RedArmy 24 janv. 2017 à 15:50

4 réponses

Meilleure réponse

J'utiliserais stuff():

select (case when col like '_-%' then stuff(col, 2, 1, '') else col
        end)

Remarque: la question concerne explicitement le tiret, je suppose donc que l'espace dans la troisième ligne est une faute de frappe.

4
Gordon Linoff 24 janv. 2017 à 12:51

S'il n'y a que GBDDR dans cette table, vous pouvez utiliser:

SELECT  SUBSTRING(columnName,CHARINDEX('GB',columnName)-1,LEN(columnName))
FROM tableName

Ou:

SELECT  CASE WHEN LEN(columnName)-LEN(REPLACE(columnName,'-','')) > 2
            --if we got more than two dashes
            THEN LTRIM(SUBSTRING(columnName,CHARINDEX('-',columnName)+1,LEN(columnName))) 
            --take sub-string from first occurrence of dash+1 to the end of the string 
            ELSE columnName END 
            --else take the full string
FROM tableName

Production:

1GBDDR3-1066-21
2GBDDR3-1066-21
4GBDDR3-1066-414
1GBDDR3-1066-21
1GBDDR3-1066-21
1
gofr1 24 janv. 2017 à 14:31

Vous pouvez utiliser PATINDEX avec RIGHT, LEN et LTRIM:

Créer et remplir un exemple de tableau ( Veuillez enregistrer cette étape dans vos futures questions)

DECLARE @T AS TABLE
(
    col varchar(30)
)

INSERT INTO @T VALUES
('1GBDDR3-1066-21'),
('2GBDDR3-1066-21'),
('3- 4GBDDR3-1066-414'),
('1GBDDR3-1066-21'),
('2-1GBDDR3-1066-21')

La requête:

SELECT CASE WHEN PATINDEX('[0-9]-%', col) > 0 THEN
           LTRIM(RIGHT(col, LEN(col)-2))
       ELSE
          col
       END
FROM @T

Résultats:

1GBDDR3-1066-21
2GBDDR3-1066-21
4GBDDR3-1066-414
1GBDDR3-1066-21
1GBDDR3-1066-21
8
Graham 22 sept. 2017 à 22:59

Pour une solution alternative;

DECLARE @T AS TABLE
(
    col varchar(30)
)

INSERT INTO @T VALUES
('1GBDDR3-1066-21'),
('2GBDDR3-1066-21'),
('3- 4GBDDR3-1066-414'),
('1GBDDR3-1066-21'),
('2-1GBDDR3-1066-21')

DECLARE @refValue NVARCHAR(7)='GBDDR3'
SELECT 
RIGHT((LEFT(col, CHARINDEX(@refValue,col)-1)),1) 
+@refValue
+RIGHT(col,LEN(col)-(CHARINDEX(@refValue,col) + LEN(@refValue))+1) FROM @T
2
enginyilmaz 24 janv. 2017 à 13:44