0
votes

Comment obtenir des valeurs séparées par des virgules en lignes avec plusieurs supports intermédiaires séparés de virgule

J'ai une chaîne comme: xxx

et je le veux comme des rangées comme: xxx

dans la requête MSSQL.


1 commentaires

Pouvez-vous nous dire pourquoi voulez-vous faire cela à l'aide de la requête MySQL et que vous voulez la réponse en tant que ligne. Si vous pouvez extraire des données, nous pouvons utiliser REGEX dans n'importe quel langage de programmation comme PHP ou pour obtenir cette sortie souhaitée. Faites-nous savoir l'obligation de pouvoir suggérer une meilleure solution.


4 Réponses :


0
votes

Eh bien, vous pouvez utiliser un syndicat ou créer une table et insérer ces données là-bas.

Union exemple xxx

et ainsi de suite.

@edit :

comprise, basée sur un commentaire, vous pouvez jeter un coup d'œil sur la réponse ici: https://stackoverflow.com/a/5493616/8416043

Je ne le multiplierai pas ici .

bonne chance


2 commentaires

Je ne suis pas sûr que cela fonctionnera pour cela, son exigence est complexe avec les données qu'il a. Il veut une chaîne dans MySQL d'être écartée où on peut utiliser Substring_index, mais il souhaite à nouveau exclure des virgules qui apparaissent dans le support


Merci pour la réponse, mais je veux demander que puis-je séparer «A», 'B' et 'C (A, B, C) ». Pour la requête de l'Union.



0
votes
IF OBJECT_ID('tempdb..#Data')IS NOT NULL
DROP TABLE #Data

CREATE TABLE #Data
(
    ID INT IDENTITY(1,1),
    String VARCHAR(MAX)
)


INSERT #Data SELECT 'a,b,c(a,b,c),d,e,L(e,d,g)'

UPDATE T SET String=REPLACE(REPLACE(String,'(','('''),')',''')') FROM #Data T

IF OBJECT_ID('tempdb..#T')IS NOT NULL
DROP TABLE #T

DECLARE @FieldSeparator VARCHAR(10)='(',@FieldSeparator1 VARCHAR(10)=')'

;WITH CTE AS
(
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1) DataItem,
        STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '') String
    FROM #Data
    UNION all
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1),
        STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '')
    FROM CTE
    WHERE String > ''
)
SELECT
    ID,
    DataItem AS String
INTO #T
FROM CTE WHERE CHARINDEX(@FieldSeparator1,DataItem)>0
ORDER BY ID


--SELECT * FROM #T

IF OBJECT_ID('tempdb..#T1')IS NOT NULL
DROP TABLE #T1

;WITH CTE AS
(
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1) DataItem,
        STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '') String
    FROM #T
    UNION ALL
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1),
        STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '')
    FROM CTE
    WHERE String > ''
)
SELECT
    ID,
    DataItem,
                DataItem NewString 
INTO #T1
FROM CTE WHERE CHARINDEX('''',DataItem)>0
ORDER BY ID

--SELECT * FROM #T1

UPDATE #T1 SET NewString=REPLACE(REPLACE(NewString,',','|'),'''','')

UPDATE #T1 SET DataItem='('+DataItem+')',NewString='('+NewString+')'

ALTER TABLE #T1 ADD Rn INT

UPDATE A SET A.Rn=Rn1 FROM
(
SELECT *,ROW_NUMBER()OVER(ORDER BY ID ASC)Rn1 FROM #T1 
)A


DECLARE @Start INT =1,@End INT=(SELECT MAX(Rn) FROM #T1),@Str VARCHAR(1000),@Id INT


WHILE @Start<=@End
BEGIN 

                UPDATE T SET T.String=REPLACE(T.String,T1.DataItem,T1.NewString) FROM #Data T
                INNER JOIN #T1 T1 ON T.ID=T1.Id AND T1.Rn=@Start

                SET @Start=@Start+1

END


--SELECT * FROM #Data
DECLARE @FieldSeparator2 VARCHAR(10)=','

;WITH CTE AS
(
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1) DataItem,
        STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '') String
    FROM #Data
    UNION all
    SELECT
        ID,
        LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1),
        STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '')
    FROM CTE
    WHERE String > ''
)
SELECT
    ID,
    REPLACE(REPLACE(DataItem,'|',','),'''','') AS String
FROM CTE 
ORDER BY ID

0 commentaires

0
votes

Quelque chose est possible avec suffisamment d'effort créatif, mais SQL Server n'est vraiment pas le lieu de faire de la manipulation de texte complexe: xxx

Ceci fonctionne en morphing la chaîne en XML, en utilisant un déchiquetage XML qui fonctionne simplement contre les virgules non imbriquées (transformées), puis défaillant la XML-IFICATION pour restaurer à l'original.

Je l'ai fait comme deux étapes distinctes afin que vous puissiez voir le Étapes intermédiaires de la XML-IFICATION SI VOUS VOULEZ.


1 commentaires

Très belle et innovante, mais si les données contiennent de l'espace, par exemple 'A, B , C (AD, B, C), R ,', il ne fonctionne pas, il ne fonctionne pas simplement, il vous suffit d'ajouter une autre remplacement comme ci-dessous Sélectionnez Remplacer (remplacer (Remplacer (remplacer (remplacer (remplacer (remplacer (convert (varc har (max), x.Query ('.')), ' ', ','), ' '', '('), ' ', ')') '),' '', ''), '' ',' ') , '', '') de (sélectionnez Convertir (XML, @ Inter2)) T (ABC) Cross Appliquer ABC.NODES ('/ C / A') U (X)



0
votes

Utilisez la fonction ci-dessous pour obtenir la liste des lignes. Il aidera xxx


2 commentaires

Merci pour la réponse mais la fonction ne donne pas le résultat correct, cela donne comme: - Si je passe une corde comme: - 'A, B, C (A, B, C), B, N (B, A, D)' Résultat As: 1. A 2. B 3. C (A 4. B 5. C) 6. B 7. N (B 8. A 9. D)


Je vérifierai et partagerai la requête pour ce que vous êtes attendu.