2013-08-07 2 views
1

Можно ли выбрать первую строку в списке?SQL select сначала найденное значение в 'in group'

Таблица bar: Колонка 'бар' значения: значение2, Value3

SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3'); 

вставили значение2 и возвращается.

Заранее спасибо

EDIT:

Значения Я ожидаю являются:

Foo 
Foobar 
Foobarsome 
Foobarsomething 

я определить это на основе длины струн, но мне также нужно значение по умолчанию, если ничего найден. Давайте скажем «ничего», но ничего больше, чем foobar, и может быть действительным значением.

+1

какой сервер и версия сервера вы используете? MySQL? оракул? db2? ms sql? – MrSimpleMind

+0

В настоящее время MySQL – John

+0

ORDER BY FIELD() LIMIT 1 – Strawberry

ответ

0

Вы можете использовать оператор CASE в предложении ORDER BY, чтобы указать порядок, основанный на значениях столбца. Затем используйте LIMIT для выбора только одной строки результата.

SELECT * FROM foo 
WHERE bar IN ('value','value1','value2') 
ORDER BY CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END 
LIMIT 1; 

Я проверил этот пример на SQL Fiddle.

ОБНОВЛЕНИЕ: Оригинальный плакат отредактировал вопрос и добавил, что он хочет сортировать по длине строки и имеет значение по умолчанию «ничего», если нет результатов.

SELECT * FROM foo 
WHERE bar IN ('value','value1','value2') 
ORDER by CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END 
LIMIT 1; 


SELECT bar FROM 
(
    SELECT bar, 0 as SortOrder FROM foo 
    WHERE bar IN ('value','value1','value2') 

    UNION 
    SELECT 'nothing' as bar, 999 as SortOrder 

) as x 
ORDER BY SortOrder, LENGTH(bar) 
LIMIT 1; 

Вы можете увидеть запрос на обновление в SQL Fiddler.

Это решение работает с использованием UNION для объединения значения по умолчанию «ничего» в результат и также включает столбец «SortOrder». Запросами UNION являются Order By the SortOrder, так что значение по умолчанию сортируется в нижней части результатов, тогда результаты сортируются по длине строки. Наконец, существует предложение LIMIT 1, поэтому значение по умолчанию «ничего» появляется в конечном результате, если это единственная запись, иначе возвращается кратчайшая строка, которая соответствует набору «в группе».

+0

Что действительно делает на самом деле? ORDER BY CASE 'fieldName' WHEN 'someValue' THEN 'что это?' – John

+0

Вот документация MySQL для оператора [CASE] (http://dev.mysql.com/doc/refman/5.0/en/case.html). Он похож на оператор switch в других языках программирования или большой оператор If-ElseIf-ElseIf ... Else. Я чаще всего видел, что он используется в предложении SELECT запроса, но также может использоваться в ORDER BY. –

0

Mysql должен работать с ..

SELECT * ОТ Foo ГДЕ бар IN ('значение', 'значение2', 'значение3') ПРЕДЕЛ 0,1;

Не могли бы вы написать свой ожидаемый результат? Это облегчит ...

+0

Я отредактировал мой вопрос. – John

2

Вы можете запросить:

SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3') LIMIT 1; 

Но без дополнительного заказа это не детерминированный, который первый ряд будет ваш результат.

+0

Это не возвращает первый результат списка. Если на самом деле возвращает последний? 'bar' IN ('fooBarSome', 'fooBar', 'foo'), если foobar и foo найдены, он возвращает foo, но я ищу первую найденную запись. В этом случае «foobar». – John

+0

Хорошо, это не то, что дает предикат IN. Согласно вашему комментарию, вы хотите: «Если n-го значения не существует, дайте мне (n + 1) -е значение». Но редактирование, которое вы внесли на свой вопрос, говорит что-то о нескольких значениях результата. Теперь я смущен :) – contradictioned

+0

У меня есть список возможных значений (этот порядок этого списка составлен пользователем) первое значение в списке тот, который я хочу выбрать. – John