Rumah  >  Soal Jawab  >  teks badan

Saya ingin mengecualikan rekod yang tidak termasuk dalam julat nilai yang ditentukan dalam kes apabila pernyataan - SQL/MySQL

Saya cuba menetapkan julat bermusim untuk tarikh tertentu daripada jadual DTBL_SCHOOL_DATES. Di bawah ialah logik saya yang menetapkan musim dalam julat tertentu berdasarkan tahun dan wilayahnya.

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"

Tetapi apabila tarikh tidak berada dalam julat yang dinyatakan dalam logik, saya mahu tarikh itu diabaikan. AKA nilai "luar julat" harus dikecualikan. Saya cuba menggunakan FTBL_TEST_SCORES.test_admin_period bukan batal dan kerana tiada nilai dalam pangkalan data adalah batal, ia tidak akan berfungsi.

Nilai yang tidak berada dalam julat harus dikecualikan daripada hasilnya, bagaimana saya boleh mencapai ini dalam klausa where

Saya cuba mengehadkan menggunakan Alias ​​​​tetapi tidak berjaya. Saya tidak pasti sama ada mungkin untuk memberikan nilai kepada medan tertentu dalam pernyataan kes, seperti Kes apabila 'a' kemudian medan ='B' tamat

Nilai yang tidak berada dalam julat harus dikecualikan daripada keputusan, bagaimana saya boleh mencapai ini dalam klausa where

P粉428986744P粉428986744404 hari yang lalu558

membalas semua(2)saya akan balas

  • P粉083785014

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

    Tanpa dapat melihat pertanyaan lengkap, adalah mustahil untuk menghasilkan penyelesaian yang terbaik. Penyelesaian paling mudah ialah menambah kriteria sebagai klausa HAVING:

    HAVING `C4630` <> 'NOT IN RANGE'
    

    Saya keliru tentang format tarikh anda. Jika ini sepatutnya pertanyaan MySQL, mereka harus dalam format yyyy-mm-dd. Boleh dikatakan, mereka harus dalam format ini walaupun pada SQL Server yang menyokong format tarikh asli yang tidak jelas.

    Kenapa mereka semuaRTRIMCAST? Data harus disimpan dalam format yang betul dan dibersihkan pada input, jika ini tidak mungkin, bersihkan data dengan kerap dan bukannya untuk setiap pertanyaan.

    Adalah bijak untuk menggerakkan 季节移动到它们自己的表中,而不是在查询时定义它们。然后它是一个简单的连接到seasons anda. Saya menggunakan subkueri di sini, tetapi semoga anda mendapat idea:

    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'
    );
    

    balas
    0
  • P粉718165540

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

    Anda boleh mengulangi keseluruhan kenyataan KES dalam klausa WHERE seperti ini:

    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'

    Atau anda boleh menggunakan subquery (atau CTE) seperti ini:

    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'

    balas
    0
  • Batalbalas