Mengisih hasil mysql dengan dua lajur, tetapi dengan lajur "lubang".
P粉118698740
P粉118698740 2023-09-11 12:14:50
0
1
413

Situasi awal saya adalah seperti berikut:

  +------------+-------------+
  | legacyRank | forcedRank  |
  +------------+-------------+
  | 0          | NULL        |
  | 1          | 6           |
  | 2          | NULL        |
  | 3          | 1           |
  | 4          | NULL        |
  | 5          | NULL        |
  | 6          | 2           |
  +------------+-------------+

Anda boleh menjana jadual ini melalui skema berikut:

CREATE TABLE two_column_order (
  legacyRank VARCHAR(45),
  forcedRank VARCHAR(45)
);

INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (5, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (6, 2); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (7, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (0, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (1, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (2, 6); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (3, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (4, 1); 


SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  <> NULL THEN `forcedRank`
  ELSE `legacyRank`
  END

Matlamatnya adalah untuk memastikan setiap baris tidak mengandungi NULL forcedRank 列的行放置在此 forcedRank pada kedudukan tepat yang dinyatakan dalam lajur. Paparan yang dijangkakan adalah seperti berikut:

  +------------+-------------+
  | legacyRank | forcedRank  |
  +------------+-------------+
0 | 0          | NULL        |
1 | 3          | 1           |
2 | 6          | 2           |
3 | 2          | NULL        |
4 | 4          | NULL        |
5 | 5          | NULL        |
6 | 6          | 6           |
  +------------+-------------+

Seperti yang anda lihat, jika tidak NULL, setiap baris diambil apabila diisih mengikut lajur forcedRank 列排序的位置。当 NULL 行仍然按 legacyRank pada kedudukan yang tidak diduduki oleh baris bukan NULL, tetapi baris paksa tidak pernah dialihkan.

Mengikut perintah ini, saya mencuba dalam ORDER BY 中使用 CASE WHEN sintaks seperti ini:

SELECT * FROM two_column_order

order by 
  CASE WHEN (`forcedRank` is NULL )  THEN `legacyRank`
  END ,

  -`forcedRank` DESC,
  `legacyRank`

Tetapi hasilnya tidak menepati jangkaan saya:

+------------+-------------+
| legacyRank | forcedRank  |
+------------+-------------+
| 3          | 1           |
| 6          | 2           |
| 6          | 6           |
| 0          | NULL        |
| 2          | NULL        |
| 4          | NULL        |
| 5          | NULL        |
+------------+-------------+

Jadi, bagaimanakah caranya saya membuat legacyRank lajur tersusun melebihi baris pangkat paksa tanpa mengalihkannya?

P粉118698740
P粉118698740

membalas semua(1)
P粉141925181

NULL 不能像您需要使用 IS 那样进行比较,或者在您的情况下使用 IS NOT

SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  IS NOT NULL THEN `forcedRank`
  ELSE `legacyRank`
  END
LegacyRank Kedudukan paksa
0 kosong
1 kosong
4 1
6 2
3 kosong
5 kosong
2 6
7 kosong

Violin

Kerana jawapan pertama tidak akan memberikan anda jawapan yang betul.

Saya menukar susunan dengan menambah titik perpuluhan pada nombor asal supaya ia lebih besar daripada kedudukan paksa baharu.

Ia akan mengekalkan susunan dan memaksa nombor menjadi lebih kecil daripada kedudukan tradisional dan ia akan mendapat keputusan berikut

SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  IS NOT NULL THEN `forcedRank` 
  ELSE `legacyRank` + .1
  END
LegacyRank Kedudukan paksa
0 kosong
4 1
1 kosong
6 2
3 kosong
5 kosong
2 6
7 kosong

Violin

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan