MySql funzione CONCAT_WS

Gioweb

Nuovo Utente
2 Apr 2014
21
0
0
Ciao trovo molto utili le VIEW in MySql per crearmi delle tabelle (view) ordinate come servono a me per poi ad esempio scaricarmi da phpmyadmin dei database in vari formati csv,xls ecc. per mille esigenze, vi facci un esempio:

Codice:
CREATE VIEW markers AS
SELECT id AS id,
rag_sociale AS name,
latitudine AS lat,
longitudine AS lng,
CONCAT_WS (' ',indirizzo,cap,comune,provincia) AS address
FROM rivenditori
ORDER BY cap, comune ASC;


Adesso vorrei aggiungere un campo URL cercando di concatenare un url con il suo ID variabile tramite la funzione CONCAT_WS


Codice:
CONCAT_WS (' ',http://it.xxx.net/xxx/scheda.asp?id=,id) AS url,
il risultato però mi da uo spazio tra il link e l'ID così:
Codice:
http://it.xxx.net/xxx/scheda.asp?id= 333
e questo ovviamente corrompe il link, sbaglio qualcosa tipo non è adatta la funzione CONCAT_WS per questa operazione?


Altra cosa, ho concatenato 4 campi che contengono servizi offerti ma nel database i valori sono SI/NO mentre vorrei mostrare il nome del servizio quando il campo contiene SI


Codice:
CONCAT_WS (' ',servizio1,servizio2,servizio3) AS servizi,
il risultato stampato è SI,SI,SI, oppure SI,NO,SI ecc. ecc. come posso sostituire il valore con il nome del servizio?

Sarei grato se mi potete indirizzare per risolvere questi due problemi. :)
 
Sono un po sul disperato... probabilmente la funzione concat non è adatta, help me.

Questo è lo schema del campo servizi, qualche idea su come fare?

Codice:
"Si No No No No"
"Servizio1"

"Si Si No No No"
"Servizio1, Servizio2"

"Si Si Si No No"
"Servizio1, Servizio2, Servizio3"

"Si Si Si Si No"
"Servizio1, Servizio2, Servizio3, Servizio4"

"Si Si Si Si Si"
"Servizio1, Servizio2, Servizio3, Servizio4, Servizio5"

"Si No Si Si Si"
"Servizio1, Servizio3, Servizio4, Servizio5"

"Si Si No Si Si"
"Servizio1, Servizio2, Servizio4, Servizio5"

"Si Si Si No Si"
"Servizio1, Servizio2, Servizio3, Servizio5"

"Si Si Si Si No"
"Servizio1, Servizio2, Servizio3 Servizio4"

questa la struttura come dovrebbe essere

Codice:
CREATE VIEW markers AS
SELECT id AS id,
rag_sociale AS name,
servizi,
latitudine AS lat,
longitudine AS lng,
CONCAT_WS (' ',indirizzo,cap,comune,provincia) AS address
FROM rivenditori
ORDER BY cap, comune ASC;

Grazie
 
Ciao, il primo problema lo puoi risolvere con la funzione CONCAT che a differenza di CONCAT_WS non ti aggiunge il separatore
Codice:
CONCAT('http://it.xxx.net/xxx/scheda.asp?id=',id)
Il secondo non l'ho capito
 
Grazie adesso non c'è più lo spazio! Per la seconda cerco di spiegarmi meglio:

Nella tabella di origine "rivenditori" ho 3 servizi denominati ad es.: "Servizio1, Servizio2, Servizio3". Il valore utilizzato per indicare di quale servizio dispone il rivenditore nella tabella originale è Si/NO in ognuno dei 3 campi.

Con il CONCAT_WS
Codice:
CONCAT_WS (' ',servizio1,servizio2,servizio3) AS servizi,
nel risultato mi appare SI,SI,NO oppure SI,SI,SI ecc. ecc.

Come posso mostrare il nome dei servizi (Servizio1, Servizio3,ecc) quando il valore è Si?
 
Come posso mostrare il nome dei servizi (Servizio1, Servizio3,ecc) quando il valore è Si?

ciao,
leggendo il manuale mySQL
http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if
http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#function_strcmp
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

chissà,
Codice:
....
longitudine AS lng,
CONCAT_WS (' ',indirizzo,cap,comune,provincia) AS address,
REPLACE(
  CONCAT_WS (' ',
    IF(STRCMP(servizio1,'SI'),'xNO','servizio1'),
    IF(STRCMP(servizio2,'SI'),'xNO','servizio2'),
    IF(STRCMP(servizio3,'SI'),'xNO','servizio3')
  ), ' xNO', ''
) AS servizi
FROM rivenditori
potrebbe lavorare bene ....
non ho mySQL e non posso provarla,
preferisco avere in risposta 'xNO' se negativo,
perchè potrebbe rispondere NULL se impostata con doppi apici ('')
dal tuo esempio, la virgola dopo ciascun servizio l'ho tralasciata, rende la gestione più difficile
ciao
Marino
 
Ultima modifica:
Grazie marino51! con qualche piccola modifica il codice fa quello che mi serviva, funziona alla grande!
Per 'xNO' dopo aver visto che funzionava, l'ho svuotato così '' per non mostrarlo.
Per i punti vendita che hanno ad esempio solo il servizio1 e il servizio5, tra i due nomi stampati mi si frapponevano 4 spazi un po antiestetici, allora ho pensato di sostituire CONCAT_WS con CONCAT che come ha scritto criric non restituisce spazi, gli spazi che mi servivano tra un servizio e l'altro li ho messi direttamente nel testo replace tranne per l'ultimo servizio che conclude.

Codice:
....
longitudine AS lng,
REPLACE(
CONCAT (' ',
IF(STRCMP(servizio1,'Si'),'','Nome Servizio 1 '),
IF(STRCMP(servizio2,'Si'),'','Nome Servizio 2 '),
IF(STRCMP(servizio3,'Si'),'','Nome Servizio 3 '),
IF(STRCMP(servizio4,'Si'),'','Nome Servizio 4 '),
IF(STRCMP(servizio5,'Si'),'','Nome Servizio 5')
),'',''
FROM rivenditori
[/QUOTE]

Ho evitato di mettere virgole come mi servivano dopo il punto 1,2,3,4 e punto finale dopo il servizio 5 nel testo replace, perchè se un negozio ha solo il servizio 1 appare giustamente una virgola al posto del punto. Mi potete consigliare qualcosa per questo?

Grazie ancora a tutti e due, mi havete risolto un bel problema!!!! :byebye:
 
ciao,
in realtà ' xNO' era preceduto da uno spazio nel mio esempio proprio per gli "inestetismi",
per la virgola, puoi mettere una "replace" più esterna che ti sostituisce lo spazio con virgola e spazio a patto che "servizio_1"
non abbia spazio tra la parola servizio e 1
ciao
Marino
 
Ultima modifica:

Discussioni simili