2017-02-14 2 views
0

Ich stehe vor einem Dilemma, wo ich eine Zeichenfolge basierend auf dem Parameter erstellen muss.MySQL Stored Procedure Fälle für IN Funktion

CASE gender_Case 
WHEN CONCAT("1") THEN 
SET @tempString = CONCAT('M'); 
WHEN CONCAT("2") THEN 
SET @tempString = CONCAT('F'); 
ELSE 
SET @tempString = CONCAT('M','F'); 
END CASE;  

Der Query Ich werde bauen:

SELECT @uid:=uid FROM search_optimized_table where country = country 
and uid !=userId and TIMESTAMPDIFF(YEAR,DOB,CURDATE()) 
BETWEEN minAge and maxAge and gender IN (@tempString) 

Für den Fall 1 und 2 funktioniert gut. Aber anders als Fall 1 und Fall 2. Es schlägt einfach fehl.

Irgendeine Idee, wie man es repariert?

Szenario:

Wenn Anrufer Fall 1 empfängt, wird es die Abfrage nach Geschlecht in (M) erstellen. Aber in meinem Fall schlägt Fall 3 immer fehl.

EDIT:

CASE gender_Case 
    WHEN CONCAT("1") THEN 
    SET @tempString = "M"; 
    WHEN CONCAT("2") THEN 
    SET @tempString = "F"; 
    ELSE 
    SET @tempString = "M,F"; 
    END CASE;  

Die erste und zweite Werke oben, aber nicht die dritte.

Antwort

0

ich musste Veränderung die gesamte Abfrage auf eine andere Version mit concat in meiner Abfrage selbst. Für den Fall:

CASE gender_Case 
    WHEN CONCAT("1") THEN 
    SET @tempString = "gender IN ('M')"; 
    WHEN CONCAT("2") THEN 
    SET @tempString = "gender = ('F')"; 
    ELSE 
    SET @tempString = "gender IN ('M','F')"; 
    END CASE;  

Für die Erstellung von Abfragen:

SET @query = CONCAT('INSERT INTO temp_local_search(
      SELECT @uid:=uid FROM search_optimized_table 
      where country = ',country,' and uid !=',userId,' and 
      TIMESTAMPDIFF(YEAR,DOB,CURDATE()) BETWEEN ',minAge,' and ',maxAge,' and ',@tempString,';'); 
0

Bitte versuchen Sie den Teil der Abfrage wie folgt, und lassen Sie mich arbeiten, wenn es funktioniert oder nicht:

CASE WHEN gender_Case="1" THEN SET @tempString = "'M'"; 
    WHEN gender_Case="2" THEN SET @tempString = "'F'"; 
    ELSE SET @tempString = "'M','F'"; 
END; 

SET @Query = CONCAT("SELECT @uid:=uid FROM search_optimized_table where country = country 
and uid !=userId and TIMESTAMPDIFF(YEAR,DOB,CURDATE()) 
BETWEEN minAge and maxAge and gender IN (",@tempString,") "); 

PREPARE stmtForQuery FROM @Query; 
EXECUTE stmtForQuery; 
DEALLOCATE PREPARE stmtForQuery; 

(Anmerkung: wir für CASE in MySql zwei Syntax tun Eine davon ist die Art und Weise Sie implementiert haben. und das andere ist dies ein. das wird nicht einen Unterschied machen. Was ich geändert haben die Zeichenfolge, die Sie für Parameter IN verwenden.)

+0

, nun mein 1., 2. und 3. Methode nicht funktionieren kann. – FreedomPride

+0

versuchen Sie es jetzt, ich fälschlicherweise Fall nach Ende hinzugefügt; –

+0

kein Glück auch. aber die erste und zweite Arbeit für mich dafür: '' '\t FALL WENN gender_Case =" 1 "DANN SET @tempString =" M "; \t \t \t \t \t \t \t \t WHEN gender_Case = "2" SET THEN @tempString = "F"; \t \t \t \t \t \t \t SONST SET @tempString = "M, F"; \t \t \t \t \t \t ENDKOFFER; \t '' ' – FreedomPride

0

Warum nicht 2 tempstrings

IF GENDER_CASE = 1 THEN 
    SET @ASTRING = 'M'; 
    SET @BSTRING = 'M'; 
    ELSEIF GENDER_CASE = 2 THEN 
    SET @ASTRING = 'F'; 
    SET @BSTRING = 'F'; 
    ELSE 
    SET @ASTRING = 'M'; 
    SET @BSTRING = 'F'; 
    END IF; 
Verwandte Themen