SQL не в алфавитном порядке в WHERE IN

Допустим, у меня есть этот запрос:

SELECT name
FROM product
WHERE name IN ('CE367FAACDHCANPH-151556',
                  'CE367FAACEX9ANPH-153877',
                  'NI564FAACJSFANPH-162605',
                  'GE526OTACCD3ANPH-149839')

результат:

CE367FAACDHCANPH-151556
CE367FAACEX9ANPH-153877
GE526OTACCD3ANPH-149839
NI564FAACJSFANPH-162605

который упорядочен в алфавитном порядке

Как получить порядок результатов по индексу появления в списке?

в основном я хочу этого в результате:

CE367FAACDHCANPH-151556
CE367FAACEX9ANPH-153877
NI564FAACJSFANPH-162605
GE526OTACCD3ANPH-149839

person user2461031    schedule 29.04.2014    source источник
comment
какую базу данных вы используете?   -  person Lukas Eder    schedule 29.04.2014
comment
какой у вас порядок в списке...??   -  person Ganesh_Devlekar    schedule 29.04.2014


Ответы (2)


Вам нужно будет явно упорядочить эти значения в вашем списке, например. используя выражение CASE:

SELECT name
FROM product
WHERE name IN ('CE367FAACDHCANPH-151556',
               'CE367FAACEX9ANPH-153877',
               'NI564FAACJSFANPH-162605',
               'GE526OTACCD3ANPH-149839')
ORDER BY CASE WHEN name = 'CE367FAACDHCANPH-151556' THEN 1
              WHEN name = 'CE367FAACEX9ANPH-153877' THEN 2
              WHEN name = 'NI564FAACJSFANPH-162605' THEN 3
              WHEN name = 'GE526OTACCD3ANPH-149839' THEN 4
         END

Пример на SQLFiddle

Если вы хотите избежать повторения этих литералов, вы можете прибегнуть к этому трюку:

SELECT product.name
FROM product
JOIN (
  VALUES('CE367FAACDHCANPH-151556', 1),
        ('CE367FAACEX9ANPH-153877', 2),
        ('NI564FAACJSFANPH-162605', 3),
        ('GE526OTACCD3ANPH-149839', 4)
) AS sort (name, sort)
ON product.name = sort.name
ORDER BY sort.sort

Пример на SQLFiddle

person Lukas Eder    schedule 29.04.2014

Вы можете использовать PATINDEX. По крайней мере, если ваши имена имеют более или менее одинаковую структуру.

SELECT [Name] FROM product 
ORDER BY CONVERT(INT, LEFT(Name, PATINDEX('%[^0-9]%', Name+'z')-1));

Посмотрите этот пример на SQL Fiddle.

person Teis Lindemark    schedule 29.04.2014