cari

Rumah  >  Soal Jawab  >  teks badan

Mengisih hasil mysql dengan dua lajur, tetapi dengan lajur "lubang".

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粉118698740P粉118698740484 hari yang lalu432

membalas semua(1)saya akan balas

  • P粉141925181

    P粉1419251812023-09-12 09:02:45

    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

    balas
    0
  • Batalbalas