Rumah > Soal Jawab > teks badan
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粉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 semuaRTRIM
和CAST
? 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粉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'