Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 3.256 pregleda

Najnovija ↓

Dinamicki ORDER BY 14.01.2007. u 13:40 · pre 241 mesec #1
Radim u SQL Server-u 2005 i imam jednu ovakvu tabelu :)

Code:

CREATE TABLE Boje
(
    Id INT, 
    Opis VARCHAR(20)
)

INSERT INTO Boje VALUES (1, 'Bela')
INSERT INTO Boje VALUES (2, 'Plava')
INSERT INTO Boje VALUES (3, 'Zuta')
INSERT INTO Boje VALUES (4, 'Crvena')
INSERT INTO Boje VALUES (5, 'Zelena')


I sad hocu dinamicki da pravim ORDER BY klauzulu u zavinosti od ulaznog parametra stored procedure. Na google sam nasao samo ovaj nacin za to. Na primer hocu da sortiram po koloni Opis.

Code:

DECLARE @kolona VARCHAR(4)
SET @kolona = 'Opis'
SELECT Id, Opis
FROM Boje
ORDER BY
          CASE @kolona 
            WHEN 'Id' THEN Id
            WHEN 'Opis' THEN Opis
          END


Vraca mi gresku
''Conversion failed when converting the varchar value 'Bela' to data type int''

Ukoliko su sve kolone u CASE po kojima je moguce sortirati istog tipa, onda radi lepo, ali meni treba u kombinaciji sa INT, MONEY pa i BIT ako moze.

Zanmiljivo je da ukoliko je kombinacija VARCHAR i MONEY poruka je jos neodredjenija
''Cannot convert a char value to money. The char value has incorrect syntax.''

Da li postoji neko drugo resenje? Molim za pomoc.

Code:

DROP TABLE Boje

Re: Dinamicki ORDER BY 14.01.2007. u 14:00 · pre 241 mesec #2
A da u case-u konvertujes sve u isti tip? Probaj da li moze ovako:
Code:

DECLARE @kolona VARCHAR(4)
SET @kolona = 'Opis'
SELECT Id, Opis
FROM Boje
ORDER BY
          CASE @kolona 
            WHEN 'Id' THEN convert(varchar,Id)
            WHEN 'Opis' THEN convert(varchar,Opis)
          END

Re: Dinamicki ORDER BY 14.01.2007. u 14:53 · pre 241 mesec #3
Ja sam to u SQL 2000 rešavao na drugi način probaj da li to radi i na SQL 2005

Code:
DECLARE @kolona VARCHAR(4)
SET @kolona = 'Opis'

declare @sql = varchar(255)
set @sql ='SELECT Id, Opis FROM Boje ORDER BY '

if @kolona = 'Opis'
begin
       set @sql = @sql + 'Opis'
end
else if @kolona = 'Id'
begin
       set @sql = @sql + 'Id'
end

exec(@sql)

Potpis
You can fool some people sometimes,
But you can't fool all the people all the time. (Bob Marley)
Re: Dinamicki ORDER BY 14.01.2007. u 15:39 · pre 241 mesec #4
Citat:
DarkMan: A da u case-u konvertujes sve u isti tip? Probaj da li moze ovako:
Code:

DECLARE @kolona VARCHAR(4)
SET @kolona = 'Opis'
SELECT Id, Opis
FROM Boje
ORDER BY
          CASE @kolona 
            WHEN 'Id' THEN convert(varchar,Id)
            WHEN 'Opis' THEN convert(varchar,Opis)
          END


Svaka cast, radi. :)
Ali izgleda da ne kapiram kako hehe. Nekako mi nije logicno ko kome tu sta castuje kada ORDER BY ocekuje samo naziv kolone.

Citat:
dekibre: Ja sam to u SQL 2000 rešavao na drugi način probaj da li to radi i na SQL 2005

Code:
DECLARE @kolona VARCHAR(4)
SET @kolona = 'Opis'

declare @sql = varchar(255)
set @sql ='SELECT Id, Opis FROM Boje ORDER BY '

if @kolona = 'Opis'
begin
       set @sql = @sql + 'Opis'
end
else if @kolona = 'Id'
begin
       set @sql = @sql + 'Id'
end

exec(@sql)



Hvala radi i ovo, mada ovo sam ustvari u startu odbacio jer mi to dodje isto kao da generisem SQL string u srednjem sloju, sto je ok ali sada su mi performanse jako bitne. Cak se plasim i za ovo castovanje koje mi DarkMan postovao. Sta mislite koliko koji nacin trosi resurse?
Re: Dinamicki ORDER BY 14.01.2007. u 15:55 · pre 241 mesec #5
Ups ipak nije resenje, kada konvertujem INT/MONEY mi sortira kao stringove. Sad cu da proguglam nesto oko trimovanja da dodam nule sa leve strane ako moze.
Re: Dinamicki ORDER BY 14.01.2007. u 18:59 · pre 241 mesec #6
Kada imaš kolone sa različitim tipovima podataka, ovo radi posao:
Code:

DECLARE @kolona VARCHAR(4)
SET @kolona = 'Id'

SELECT Id, Opis
FROM Boje
ORDER BY CASE @kolona WHEN 'Id' THEN Id ELSE NULL END,
         CASE @kolona WHEN 'Opis' THEN Opis ELSE NULL END
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme