96425


PostgreSQL の PL/pgSQL  
A5：SQL Mk2 x64 を使用しています。  
Windows 11です。

以下のようなお菓子を分類する関数を作っていますが、エラーが出てしまいます。

IFで書いてみたり、CASE文の書き方を変えてみたりしましたが、うまくいきません。  
何が悪いのかわかりません。  
すいませんが教えてください。よろしくお願いいたします。

エラーメッセージ:

[code]

    ´やきもの系’もしくはその周辺で構文エラー
    
[/code]

SQL:

[code]

    CREATE OR REPLACE FUNCTION public.okashi_bunrui(okashi character varying)
     RETURNS character varying
     LANGUAGE plpgsql
    AS $function$
    
    BEGIN 
        CASE
            WHEN okashi IN ('crackers','せんべい','senbei') THEN 'やきもの系';
            
            WHEN okashi IN ('飴','アメ','candy','キャンディ') THEN 'アメ系';
            
            WHEN okashi IN ('チョコ','チョコレート','chocolate') THEN 'チョコ系';
            
            ELSE;
    
        END CASE;
    END;
    $function$
    
[/code]


CC BY-SA 4.0
2023-10-04T09:34:37.163
96420
2023-10-05T02:27:10.860
2023-10-04T20:35:31.530
3060
59991
question
sql postgresql
PostgreSQLの PL/pgSQLの条件分岐で行き詰ってます。


文字列や数値を直接戻す場合は`THEN`の後ろの`;`が不要です。(`THEN 'やきもの系'`や`THEN 0`など)  
また`ELSE`を記述した場合は、`ELSE NULL`のように戻す値を指定してください。  
※`:=`で変数への代入を直接行う命令文を記述する場合は`THEN`の後ろに`;`が必要です。(`THEN bunrui := 'やきもの系';`など)

蛇足ですがCASE文を書いても値を変数などに代入しないと意味がありません。  
代入後の変数を末尾で`return`するコーディングが関数の基本的な使い方です。  
下記のサンプルコードは`CASE`文を使って3種類の方法で`bunrui`変数に値を代入する例です。

**サンプルコード**

[code]

    CREATE OR REPLACE FUNCTION public.okashi_bunrui(okashi character varying)
     RETURNS character varying
     LANGUAGE plpgsql
    AS $function$
    declare 
        bunrui character varying(20);
    begin
    
        -- SELECT INTOで代入
        select
        CASE 
            WHEN okashi IN ('crackers','せんべい','senbei') THEN 'やきもの系'
            WHEN okashi IN ('飴','アメ','candy','キャンディ') THEN 'アメ系'
            WHEN okashi IN ('チョコ','チョコレート','chocolate') THEN 'チョコ系'
            -- ELSE NULL -- 省略可
        END
        into bunrui;
    
        -- CASE文の戻り値を代入
        bunrui := CASE 
                      WHEN okashi in ('crackers','せんべい','senbei') THEN 'やきもの系'
                      WHEN okashi IN ('飴','アメ','candy','キャンディ') THEN 'アメ系'
                      WHEN okashi IN ('チョコ','チョコレート','chocolate') THEN 'チョコ系'
                      ELSE '該当なし'
                  END CASE;
    
        -- CASE文の中で代入
        CASE 
            WHEN okashi in ('crackers','せんべい','senbei') THEN bunrui := 'やきもの系';
            WHEN okashi IN ('飴','アメ','candy','キャンディ') THEN bunrui := 'アメ系';
            WHEN okashi IN ('チョコ','チョコレート','chocolate') THEN bunrui := 'チョコ系';
            ELSE bunrui := null;
        END CASE;
    
        RETURN bunrui;
    END;
    $function$;
    
[/code]


CC BY-SA 4.0
2023-10-05T02:27:10.860
96425
2023-10-05T02:27:10.860
9820
96420
answer