2011-12-12 11 views
5

Hi guys Mam następujące zapytanie w SQLsql uzyskanie informacji, ale w niewłaściwej kolejności

SELECT 
a1 
FROM 
dbo.myProductNames 
WHERE 
keycode = 40 OR keycode = 28 OR keycode = 32 OR keycode = 50 

a1 = nazwa potrzebuję informacji w tabeli do wyjścia nazwiska jego zapytaliśmy w ive kolejności zadawanych , więc potrzebuję 40, aby być pierwszym, a następnie 28.

Powodem tego jest mój kod odczytuje wyniki i zapisuje w tablicy, która następnie jest używana do wyświetlania w formularzu.

tabela że zapytanie SQL pochodzi posiada informacje przechowywane w kolejności num, więc 28 będzie najpierw przeczytać itp itd

Jak już powiedziałem, że trzeba uzyskać informacje w celu wszedłem w gdzie klauzula.

Zastanawiam się, co zrobić z zagnieżdżonymi instrukcjami Select, chociaż nigdy nie próbowałem zagnieżdżonych zaznaczeń.

Czy jest tam łatwy sposób?

Każda pomoc będzie świetna!

Wielkie dzięki z góry!

!!!!! AKTUALIZACJA !!!!!

ok, oto rozwiązanie dzięki wam!

SqlCommand pgNameFill = new SqlCommand("SELECT a1, CASE keycode WHEN @pg1 THEN 1 WHEN @pg2 THEN 2 WHEN @pg3 THEN 3 WHEN @pg4 THEN 4 END AS SortOrder FROM dbo.myProductNames WHERE keycode IN (@pg1, @pg2, @pg3, @pg4) ORDER BY SortOrder ASC", conny1); 

     pgNameFill.Parameters.AddWithValue("@pg1", pg1); 
     pgNameFill.Parameters.AddWithValue("@pg2", pg2); 
     pgNameFill.Parameters.AddWithValue("@pg3", pg3); 
     pgNameFill.Parameters.AddWithValue("@pg4", pg4); 
     SqlDataReader readpg = pgNameFill.ExecuteReader(); 

Wielkie dzięki za wszystkie posty! szkoda, że ​​nie mogę oznaczyć więcej odpowiedzi niż tylko jedno, oh, wszystko wokół!

+2

Przy okazji można też użyć WHERE kod dostępu w oknie (40,28,32,50) i wydaje się, że szukasz jakiegoś rodzaju ZAMÓWIENIA? – Ruben

+0

Na podstawie kilku komentarzy, które napisałeś, stwierdzasz, że zostaną sparametryzowane. Czy będzie to, że masz stałą liczbę parametrów całkowitych? A może potrzebujesz rozwiązania, które akceptuje "dowolną liczbę" parametrów i nadal utrzymuje zamówienie? Czy będzie to dynamiczny sql (budowanie łańcucha sql do wykonania, z parametrami przywoływanymi w tym łańcuchu), czy procedura składowana? Również, dla której wersji SQL to jest? – MatBailie

+0

ah tak, zawsze będą to 4 parametry, używając MSSQL na serwerze z 2008 roku.i użyję zaznaczenia w ciągu znaków dołączonym do mojego kodu w C# – lemunk

Odpowiedz

5

Dodaj następujące ORDER BY:

ORDER BY 
CASE keycode 
    when 40 then 1 
    when 28 then 2 
    when 32 then 3 
    when 50 then 4 
END 
+0

zaktualizował mój post – lemunk

+0

legenda! działa dobrze! – lemunk

4

Należy użyć słowa kluczowego ORDER BY. Jeśli w zapytaniu nie określono zamówienia, nie ma gwarancji, w jakiej kolejności baza danych zwróci rekordy. Kolejność rekordów w tabeli niekoniecznie będzie kolejnością rekordów w wynikach zapytania.

Jeśli wymagane zamówienie nie ma charakteru ściśle liczbowego lub alfabetycznego, może okazać się konieczne dodanie do stołu dodatkowej kolumny SortOrder, którą można następnie posortować według potrzeb.

+2

ale zamówienie przez co? chce zamówić przez kod, ale nie ASC lub DESC, ale w określony sposób dla każdego zapytania (jeśli dobrze rozumiem). – Flo

+0

Zgadzam się i zwykle jest to moja pierwsza próba rozwiązania tego drobnego problemu. Ale kolejność jest zgodna z życzeniem użytkownika, więc może nie być zamówienia, to jest największy problem, który mam – lemunk

+0

dokładnie prawo flo, ponieważ powiedziałem, że jest to denerwujący problem ustawiony przez użytkownika hehe, gdybym miał mój sposób bym po prostu posortuj informacje ASC lub DESC i nie będzie żadnych problemów! – lemunk

5

Jeden sposób (przy założeniu mssql z historii);

;with myRank(rank, keycode) as (
    select 1, 40 union 
    select 2, 28 union 
    select 3, 32 union 
    select 4, 50 
) 
select 
    a1 
from 
    myProductNames 
    inner join myRank on (myProductNames.keycode = myRank.keycode) 
order by 
    myRank.rank asc 
+0

który wygląda interesująco, jest jeszcze jedna rzecz, chociaż patrząc na to, co zrobiłeś, moje wartości będą parametrami przekazanymi, więc będzie to keycode = @ pg1. czy to jest w porządku, aby przekazać parametry takie jak to czy musi być zrobione inaczej? – lemunk

+0

To zależy od tego, czym dokładnie jest zmienna, możesz użyć zmiennych w cte, jak w 'select 1, @ 1stparam_with_top_rank union ...' –

+0

Osobiście uniknęłoby to zakodowania tego rodzaju logiki w zapytaniu. Co się dzieje, gdy musi się zmienić? Może to być ból głowy związany z utrzymaniem. – Simon

2

Dodanie do odpowiedzi Simona. Chciałbym zmienić zapytanie do czegoś takiego:

SELECT 
a1, 
CASE keycode WHEN 40 THEN 1 
WHEN 28 THEN 2 
WHEN 32 THEN 3 
WHEN 50 THEN 4 END AS SortOrder 
FROM dbo.myProductNames 
WHERE keycode IN (40, 28, 32, 50) 
ORDER BY SortOrder ASC 
+0

doskonałą odpowiedź, ale moje pytanie do odbicia dotyczy parametrów. W moim kodzie użytkownik wybiera "pg" (grupę produktów), która może mieć 40 itd. Jest to następnie przekazywane jako parametr w czytniku sql w moim kodzie C#, takim jak "WHERE keycode = @ pg1 OR keycode = @ pg2 .. ..etc ". Jedyny powód, o który pytam, to fakt, że jeśli pamiętam, zawsze są pewne ograniczenia przy korzystaniu z parametrów. – lemunk

+0

Czy jestem ponad myśleniem? – lemunk

+0

zaktualizował mój post – lemunk

1
SELECT a1 
FROM myProductNames 
ORDER BY CASE WHEN keycode =40 THEN 1 
       WHEN keycode =28 THEN 2 
       WHEN keycode =32 THEN 3 
       WHEN keycode =50 THEN 4 
       ELSE 5 
       END; 
+0

zaktualizowałam mój wpis – lemunk

Powiązane problemy