Aituo Query SQL | La nostra community

Topic: Pubblico - Composto da 6 Posts di 2 Utenti.

06 Novembre, 2011 13:56 #1
seingh
Utente

seingh
Registrato: Nov, 2011
Posts: 8
Offline


Ho questa query SQL:

 1INSERT INTO forums (
 2        id, nome, descrizione, subsection
 3) SELECT fid as id, 
 4name as nome, 
 5description as descrizione, (
 6        SPLIT_STR(
 7                parentlist, ",", 1
 8        ) 
 9) as subsection from mybb_forums
ove SPLIT_STR equivale a questa funzione SQL:
 1CREATE FUNCTION SPLIT_STR(
 2  x VARCHAR(255),
 3  delim VARCHAR(12),
 4  pos INT
 5)
 6RETURNS VARCHAR(255)
 7RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
 8       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
 9       delim, '');

e devo fare in modo che se SPLIT_STR(parentlist, ",", 1) ritorna "1" deve scrivere "0" altrimenti deve scrivere il valore ritornato...
come posso fare?

07 Novembre, 2011 09:53 #2
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Ciao seingh,

puoi semplicemente utilizzare un IF:

1if(SPLIT_STR(parentlist, ",", 1)="1","0",SPLIT_STR(parentlist, ",", 1))

Questa istruzione ti permette di verificare il valore restituito dalla funzione; se è uguale a "1" l'IF restituisce "0" altrimenti restituisce il valore della funzione.

07 Novembre, 2011 10:02 #3
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Un'alternativa potrebbe essere quella di modificare la tua funzione:

 1DELIMITER $$
 2
 3DROP FUNCTION IF EXISTS `test`.`SPLIT_STR`$$
 4CREATE DEFINER=`root`@`%` FUNCTION `SPLIT_STR`(
 5    x VARCHAR(255),
 6    delim VARCHAR(12),
 7    pos INT
 8  ) RETURNS varchar(255) CHARSET latin1
 9
10BEGIN
11DECLARE toReturn varchar(255);
12SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
13         LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
14         delim, '') into toReturn;
15RETURN if(toReturn="1","0",toReturn);
16END$$
17
18DELIMITER ;

Spero che la funzione sia chiara. Se il tuo "1" col quale confrontare la stringa in realtà non è statico ma dinamico potresti prenderlo in input. Penso che questa sia una soluzione più elegante ed efficace in quanto non modifichi la tua query ma è proprio la funzione a restituirti ciò che ti interessa.

07 Novembre, 2011 17:23 #4
seingh
Utente

seingh
Registrato: Nov, 2011
Posts: 8
Offline

innanzitutto grazie per le risposte ;)
utilizzerò sicuramente la prima versione in quanto migliore...
ma ho una piccola domanda: perchè hai messo

1DELIMITER $$

e
1CREATE DEFINER=`root`@`%` FUNCTION `SPLIT_STR`
?

07 Novembre, 2011 17:37 #5
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Scusami ho testato lo script sulla mia macchina e ho dimenticato di eliminare le parti non necessarie prima di postarlo.

Comunque sia l'istruzione delimiter non fa altro che definire un nuovo separatore per le istruzioni che dai allo script.
Mi spiego meglio: il delimiter di default è il simbolo ";" che definisce la fine di una singola istruzione; visto che all'interno della mia funzione utilizzo ";" scelgo un altro delimitatore e il mio ";" verrà letto come parte della funzione e non come fine della funzione.

Per quanto riguarda il definer definisce il contesto di sicurezza che si deve utilizzare per vedere se si hanno o meno privilegi di accesso e scrittura. Se non lo definisci in automatico mysql prende quelli dell'utente corrente.

07 Novembre, 2011 18:08 #6
seingh
Utente

seingh
Registrato: Nov, 2011
Posts: 8
Offline

ok grazie mille ;)

Condividi su:

Loggati o Registrati per replicare