recherche

Maison  >  Questions et réponses  >  le corps du texte

Je souhaite exclure les enregistrements qui ne se situent pas dans la plage de valeurs spécifiée dans l'instruction case when - SQL/MySQL

J'essaie de définir une plage saisonnière pour une date spécifique à partir de la table DTBL_SCHOOL_DATES. Vous trouverez ci-dessous ma logique qui définit les saisons dans une plage donnée en fonction de l'année et de sa région.

CASE 
        WHEN RTRIM(dtbl_school_dates.local_school_year) = '2021-2022' THEN 
            CASE 
                WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '08/07/2021' and '09/08/2021' THEN 'FALL'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Bay Area' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '03/04/2022' and '03/22/2022' THEN 'SPRING'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '07/31/2021' and '09/01/2021' THEN 'FALL'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Central Valley' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '02/19/2022' and '03/08/2022' THEN 'SPRING'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '08/14/2021' and '09/15/2021' THEN 'FALL'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '11/27/2021' and '12/15/2021' THEN 'WINTER'
                WHEN RTRIM(dtbl_schools_ext.region) = 'Los Angeles' AND 
                    CAST(dtbl_school_dates.date_value AS DATE) BETWEEN '03/04/2022' and '03/22/2022' THEN 'SPRING' 
                ELSE 'NOT IN RANGE' 
            END 
        ELSE FTBL_TEST_SCORES.test_admin_period 
    END AS "C4630"

Mais chaque fois que les dates ne se situent pas dans la plage spécifiée dans la logique, je souhaite qu'elles soient ignorées. Les valeurs AKA « hors plage » doivent être exclues. J'ai essayé d'utiliser FTBL_TEST_SCORES.test_admin_period non nul et comme aucune valeur dans la base de données n'est nulle, ils ne fonctionneront pas.

Les valeurs qui ne sont pas dans la plage doivent être exclues du résultat, comment puis-je y parvenir dans la clause Where

J'ai essayé de limiter l'utilisation d'Alias ​​​​mais cela n'a pas fonctionné. Je ne sais pas s'il est possible d'attribuer une valeur à un champ spécifique dans une instruction case, comme Case when 'a' then field ='B' end

Les valeurs qui ne sont pas dans la plage doivent être exclues du résultat, comment puis-je y parvenir dans la clause Where

P粉428986744P粉428986744499 Il y a quelques jours634

répondre à tous(2)je répondrai

  • P粉083785014

    P粉0837850142023-09-12 16:42:13

    Sans pouvoir voir la requête complète, il est impossible de trouver la meilleuresolution. La solution la plus simple est d'ajouter le critère sous forme de clause HAVING :

    HAVING `C4630` <> 'NOT IN RANGE'
    

    Je ne comprends pas votre format de date. S'il s'agit de requêtes MySQL, elles doivent être au format aaaa-mm-jj. On peut soutenir qu'ils devraient être dans ce format même sur SQL Server qui prend en charge des formats de date natifs ambigus.

    Pourquoi sont-ils tousRTRIMCAST ? Les données doivent être stockées dans le format correct et nettoyées lors de la saisie. Si cela n'est pas possible, nettoyez les données régulièrement plutôt qu'à chaque requête.

    Il est sage de déplacer votre 季节移动到它们自己的表中,而不是在查询时定义它们。然后它是一个简单的连接到seasons. J'utilise une sous-requête ici, mais j'espère que vous voyez l'idée :

    SELECT
        /* other columns */
        COALESCE(seasons.season, FTBL_TEST_SCORES.test_admin_period) AS `C4630`
    FROM all_the_other_tables
    LEFT JOIN (
    
        SELECT 'Bay Area' AS region, 'FALL' AS season, '2021-08-07' AS start, '2021-09-08' AS end UNION ALL
        SELECT 'Bay Area'          , 'WINTER'        , '2021-11-27'         , '2021-12-15'        UNION ALL
        SELECT 'Bay Area'          , 'SPRING'        , '2022-03-04'         , '2022-03-22'        UNION ALL
            
        SELECT 'Central Valley'    , 'FALL'          , '2021-07-31'         , '2021-09-01'        UNION ALL
        SELECT 'Central Valley'    , 'WINTER'        , '2021-11-27'         , '2021-12-15'        UNION ALL
        SELECT 'Central Valley'    , 'SPRING'        , '2022-02-19'         , '2022-03-08'        UNION ALL
            
        SELECT 'Los Angeles'       , 'FALL'          , '2021-08-14'         , '2021-09-15'        UNION ALL
        SELECT 'Los Angeles'       , 'WINTER'        , '2021-11-27'         , '2021-12-15'        UNION ALL
        SELECT 'Los Angeles'       , 'SPRING'        , '2022-03-04'         , '2022-03-22'
    
    ) AS seasons
        ON dtbl_school_dates.local_school_year = '2021-2022'
        AND dtbl_schools_ext.region = seasons.region
        AND dtbl_school_dates.date_value BETWEEN seasons.start AND seasons.end
    WHERE (
        (dtbl_school_dates.local_school_year = '2021-2022' AND seasons.season IS NOT NULL) OR
        dtbl_school_dates.local_school_year <> '2021-2022'
    );
    

    répondre
    0
  • P粉718165540

    P粉7181655402023-09-12 13:39:57

    Vous pouvez répéter l'intégralité de l'instruction CASE dans la clause WHERE comme ceci :

    select
        case
            when x then y 
            when a then b 
            when c then d 
            else 'NOT IN RANGE'
        end as foo
    from
        table t 
    where 
        case
            when x then y 
            when a then b 
            when c then d 
            else 'NOT IN RANGE'
        end <> 'NOT IN RANGE'

    Ou vous pouvez utiliser une sous-requête (ou CTE) comme celle-ci :

    select * 
    from (
        select
            case
                when x then y 
                when a then b 
                when c then d 
                else 'NOT IN RANGE'
            end as foo
        from
            table t 
    ) 
    where foo <> 'NOT IN RANGE'

    répondre
    0
  • Annulerrépondre