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
P粉428986744
P粉428986744 2023-09-11 23:15:24
0
2
585

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粉428986744
P粉428986744

répondre à tous(2)
P粉083785014

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'
);
P粉718165540

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'
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal