Saya ingin mengecualikan rekod yang tidak termasuk dalam julat nilai yang ditentukan dalam kes apabila pernyataan - SQL/MySQL
P粉428986744
P粉428986744 2023-09-11 23:15:24
0
2
650

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

membalas semua(2)
P粉083785014

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

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'
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan