2017-02-14 5 views
0

私は、パラメータに基づいて文字列を作成する必要があるジレンマに直面しています。IN関数のMySQLストアドプロシージャケース

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;  

私が構築するつもりクエリは次のとおりです。ケース1と2については

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) 

が正常に動作しています。 しかし、ケース1とケース2以外。ただ失敗します。

どのように修正するのですか?

シナリオ:

呼び出し側がケース1を受信すると、それは (M)における男女のためのクエリを作成します。しかし、私の問題では、ケース3は常に失敗します。

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;  

第1および第2の上記の作品が、第三ません。

答えて

0

を持っていない私がしなければなりませんでした変化するクエリ全体では、クエリ内のコンカットを使用して別のバージョンに変更します。クエリの構築のための

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;  

:ケースでは

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

次のようにクエリの一部を試してみて、それが働いていたかいないなら、私が仕事させてください:

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; 

(注意:私たちは、MySQLでのCASEのための2つの構文を持っている一つは、あなたが実装されている方法です。 、およびその他のはこの1つである。文句を言わない任意の違いを作ること。私は何を変更したことは、あなたがINのパラメータに使用する文字列です。)

+0

は今、私の第一、第二と第三の方法は、動作することはできません。 – FreedomPride

+0

これを試してください。私は間違って最後に大文字小文字を追加しました。 –

+0

も運がありません。しかしこれのための私のための第一と第二の仕事: '' '\tケース時gender_Case =" 1 "THEN SET @tempString =" M "; \t \t \t \t \t \t \t \t gender_Caseは= "2" THEN @tempString = "F" を設定した場合。 \t \t \t \t \t \t \t ELSE SET @tempString = "M、F"; \t \t \t \t \t \t end case; \t '' ' – FreedomPride

0

はなぜ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;