ORDER BY көмегімен SQL көп бағаналы тапсырыс

Мен мұны көрдім:

SELECT first_name,last_name,company_name FROM users ORDER BY last_name, company_name ASC



I have a users table like this:

+------------------+--------------------+--------------------+
| first_name       | last_name          | company_name       |
+------------------+--------------------+--------------------+
| Alfa             | Alfa               | Bravo              |
+------------------+--------------------+--------------------+
| Echo             | Echo               | Alfa               |
+------------------+--------------------+--------------------+
| Delta            | Delta              |                    |
+------------------+--------------------+--------------------+
|                  |                    | Charlie            |
+------------------+--------------------+--------------------+

Қазіргі уақытта жолдардың тәртібі:

 , ,Charlie
Alfa, Alfa, Bravo
Delta, Delta,
Echo, Echo, Alfa


What I would like to achieve, is to order rows primarily by last_name but if it's not available (empty), order by company_name but in a way that it still compares this company_name-column with the last_name-columns... Sorry for possible inaccurate explanation. Here is the order I'd like to achieve:

Alfa, Alfa, Bravo
 , ,Charlie
Delta, Delta,
Echo, Echo, Alfa

EDIT: Is this possible via a single MySQL query?

2

5 жауаптар

COALESCE қолданыңыз:

SELECT first_name,last_name,company_name 
FROM users ORDER BY coalesce(last_name, company_name) ASC

COALESCE is ANSI SQL Compatible, BTW.

6
қосылды
Жұмыс істемейді. Тапсырыс бұрынғысынша бірдей болып келеді.
қосылды автор budwiser, көзі
Ия, мен бұл туралы білемін. Жоқ, өрістер бос емес, тек бос. Мен оны NULL мәндерімен тексердім, және бұл сол. Жұмыстар.
қосылды автор budwiser, көзі
Бос өрістер бос немесе бос қалдырылған ба? (Сіз айырмашылық бар екенін білесіз бе?)
қосылды автор Adrian Carneiro, көзі

ISNULL() функциясын пайдаланыңыз. Егер last_name мәні NULL болса, онда орнына тапсырыс беру үшін ол company_name мәнін пайдаланады.

ORDER BY ISNULL(last_name, company_name)

Егер соңғы_атауы NULL емес және бос жол болса, NULLIF() функциясын мына жолмен алу үшін пайдалана аласыз:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
қосылды
Curt рахмет! MySQL үшін ISNULL орнына IFNULL қолдануға тура келді, бірақ бұл аңыз болды.
қосылды автор budwiser, көзі
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
қосылды

Oracle пайдалансаңыз, бос VARCHAR бағандары NULL ретінде қарастырылады. Содан кейін жоғарыда ұсынылғандай COALESCE немесе NVL пайдаланыңыз.

Басқа, бағанда бос жол болса (NULL емес) ORDER BY CASE last_name WHEN '' THEN ... және т.б. пайдалана аласыз.

1
қосылды

Сұрауға қосымша баған қосуға болады:

SELECT first_name,last_name,company_name,
case when last_name is null 
then company_name
else last_name
end as ord 
FROM users ORDER BY ord  ASC
0
қосылды