Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    [MySQL] Recupero parziale stringa

    Avendo due campi distinti, uno per il nome e l'altro per il cognome, è possibile recuperare, direttamente in query, soltanto le prime lettere dal campo "nome" aggiungendo un punto come carattere di concatenazione, anche se nel campo "nome" ci fosse più di una parola separata da spazi?

    Ad esempio, da un nome e cognome tipo "Carl Maria Von Weber"
    si riuscirebbe a tirare fuori un risultato simile: C. M. V. Weber?

    Grazie

  2. #2
    qualcosa del genere

    codice:
    SELECT @var1:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', 2) + 1 > 2, LOCATE(' ', 'Abc Def Ghi Lmn', 2) + 1, NULL),
    @var2:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var1) + 1 > @var1, LOCATE(' ', 'Abc Def Ghi Lmn', @var1) + 1, NULL),
    @var3:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var2) + 1 > @var2, LOCATE(' ', 'Abc Def Ghi Lmn', @var2) + 1, NULL),
    @var4:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var3) + 1 > @var3, LOCATE(' ', 'Abc Def Ghi Lmn', @var3) + 1, NULL),
    CONCAT(CONCAT_WS('. ',
    SUBSTRING('Abc Def Ghi Lmn', 1, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var1, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var2, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var3, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var4, 1)), '.') AS Iniziali
    .....
    Il codice può essere sicuramente ottimizzato.
    Trova fino a 4 iniziali, la stringa di esempio che ho usato ovviamente la devi sostituire con il riferimento al tuo campo Nome.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Ciao, dai un'occhiata a questa discussione.

    http://forum.html.it/forum/showthrea...iniziali+campo

    La soluzione (in php) di anakin è ottima.

    Un'alternativa con mysql:

    codice:
    DROP TABLE IF EXISTS ints;
    CREATE TABLE ints (
    id INT NOT NULL PRIMARY KEY
    );
    INSERT INTO ints VALUES (1), (2), (3), (4), (5); 
    
    
    SELECT
    nome,
    CONCAT(
    GROUP_CONCAT(
    SUBSTRING(
    REVERSE(
    SUBSTRING_INDEX(
    SUBSTRING_INDEX(
    REVERSE(nome), ' ', ints.id
    ), ' ', -1
    )
    ), 1,1
    ) ORDER BY ints.id DESC SEPARATOR '.'
    ), '.'
    ) AS iniziali
    FROM tua_tabella, ints
    WHERE
    ints.id <= CAST((LENGTH(nome) - LENGTH(REPLACE(nome, ' ', ''))) / LENGTH(' ') AS UNSIGNED) + 1
    GROUP BY tua_tabella.id;
    Decisamente meglio quelle in php dell'altro 3d.

  4. #4
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Grazie skidx, la soluzione che mi hai proposto è perfetta! volevo chiederti un'ultima cosa però, è normale che se cerco di utilizzarla all'interno di un'altra istruzione, così: CONCAT_WS(' ', c.cognome, Iniziali) AS nomeCompleto, mi restituisce: ERROR : 1054 - Unknown column 'Iniziali' in 'field list'?

    E se ritento di utilizzarla, sempre nel CONCAT_WS già esistente, senza l'alias "Iniziali" ma specificando direttamente il nome del campo contenente i nomi, produce prima una serie di numeri è solo dopo il risultato atteso? Questo è quello che ottengo se utilizzo le tue istruzioni unitamente al CONCAT_WS già presente nella mia query: Weber 6 12 C. M. V.

    Per non complicare ulteriormente le cose, e soprattutto per poter utilizzare il tuo codice, ho dovuto eliminare il CONCAT_WS che utilizzavo per estrarre il cognome insieme al nome e, infine, per recuperare i dati li richiamo separatamente: $row->cognome e poi $row->Iniziali

    @nicola75ss
    ti ringrazio per l'aiuto ma al tuo codice sql forse sarebbe preferibile, come giustamente mi facevi notare, la soluzione diretta con php. Non quella con le espressioni regolari, anche se quella di Anªkin è grandiosa, ma l'altra... quella di uno dei miei "keymaster" preferiti (piero.mac) con un semplice explode! Magari è proprio così come dice Lui: "Gestire stringhe a quel modo non e' compito di un database".

    Grazie infinite a tutti!

  5. #5
    Originariamente inviato da neida
    Grazie skidx, la soluzione che mi hai proposto è perfetta! volevo chiederti un'ultima cosa però, è normale che se cerco di utilizzarla all'interno di un'altra istruzione, così: CONCAT_WS(' ', c.cognome, Iniziali) AS nomeCompleto, mi restituisce: ERROR : 1054 - Unknown column 'Iniziali' in 'field list'?
    Nell'elenco dei campi da selezionare non puoi fare riferimento agli alias appena dichiarati (mentre puoi farlo dalla clausola GROUP BY o HAVING per esempio).

    Comunque se vuoi concatenare anche il cognome la soluzione è questa:
    codice:
    SELECT @var1:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', 2) + 1 > 2, LOCATE(' ', 'Abc Def Ghi Lmn', 2) + 1, NULL),
    @var2:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var1) + 1 > @var1, LOCATE(' ', 'Abc Def Ghi Lmn', @var1) + 1, NULL),
    @var3:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var2) + 1 > @var2, LOCATE(' ', 'Abc Def Ghi Lmn', @var2) + 1, NULL),
    @var4:= IF(LOCATE(' ', 'Abc Def Ghi Lmn', @var3) + 1 > @var3, LOCATE(' ', 'Abc Def Ghi Lmn', @var3) + 1, NULL),
    CONCAT_WS(' ', CONCAT(CONCAT_WS('. ',
    SUBSTRING('Abc Def Ghi Lmn', 1, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var1, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var2, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var3, 1),
    SUBSTRING('Abc Def Ghi Lmn', @var4, 1)), '.'), Cognome)
    Dove appunto Cognome non è un alias ma il nome effettivo del campo.

  6. #6
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Grazie, sei formidabile!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.