Forums Neueste Beiträge
 

Zeichenfolgen numerisch sortieren

03/03/2008 - 15:00 von Christoph Schneegans | Report spam
Hallo allerseits!

Ein NVARCHAR-Feld enthàlt größtenteils ganzzahlige Werte, nach denen
ich sortieren möchte. Wie nicht-ganzzahlige oder nicht-numerische
Werte sortiert werden, ist mir ziemlich egal. Ich glaube deshalb,
mit folgendem SQL-Code das Problem einigermaßen zu erschlagen:

create table #temp (v nvarchar(5));

insert into #temp values (1);
insert into #temp values (2);
insert into #temp values (10);
insert into #temp values ('a');
insert into #temp values ('1.0');
insert into #temp values (null);

select v,
case isnumeric(v)
when 1 then cast(cast(v as float) as int)
else 0
end as ord
from #temp order by 2

drop table #temp;

Der verschachtelte CAST-Ausdruck ist IMHO erforderlich, um erst '1.0'
in 1.0 und dann in 1 zu konvertieren. Geht das eleganter oder
performanter?

Ist der CASE-Ausdruck stabil? Kann es Werte geben, die einen Fehler
in der SELECT-Anweisung verursachen?

<http://schneegans.de/usenet/mid-schreibweisen/> · Postings verlinken
 

Lesen sie die antworten

#1 Frank Kalis
03/03/2008 - 15:24 | Warnen spam
"Christoph Schneegans" wrote:

Ein NVARCHAR-Feld enthàlt größtenteils ganzzahlige Werte, nach denen
ich sortieren möchte. Wie nicht-ganzzahlige oder nicht-numerische
Werte sortiert werden, ist mir ziemlich egal. Ich glaube deshalb,
mit folgendem SQL-Code das Problem einigermaßen zu erschlagen:

create table #temp (v nvarchar(5));

insert into #temp values (1);
insert into #temp values (2);
insert into #temp values (10);
insert into #temp values ('a');
insert into #temp values ('1.0');
insert into #temp values (null);

select v,
case isnumeric(v)
when 1 then cast(cast(v as float) as int)
else 0
end as ord
from #temp order by 2

drop table #temp;

Der verschachtelte CAST-Ausdruck ist IMHO erforderlich, um erst '1.0'
in 1.0 und dann in 1 zu konvertieren. Geht das eleganter oder
performanter?

Ist der CASE-Ausdruck stabil? Kann es Werte geben, die einen Fehler
in der SELECT-Anweisung verursachen?



Deine Methode ist nicht sicher!

Füge mal diesen Datensatz Deiner Tabelle hinzu
insert into #temp values ('a'); ;-)

SELECT
*
FROM
#temp
ORDER BY
CASE WHEN PATINDEX('%[0-9]%', v) > 0
THEN CAST(v AS decimal(19,6))
ELSE NULL
END

Ob's eleganter und/oder schneller ist, musst Du selber ausprobieren. Es ist
aber stabiler.
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.org

Ähnliche fragen