2017-03-21 4 views
0

Ich werde eine Frage über Aliasing-Werte aus einer Spalte stellen. Ich werde Tage der Woche als ein intuitives Beispiel verwenden, um meine Frage zu erhalten, aber ich bin nicht fragen nach Datetime-Konvertierungen.Wie alias ich bestimmte Werte in SQL?

Angenommen, ich habe den folgenden SQL-Skript:

SELECT DaysOfWeek 
FROM [databasename].[dbo].[tablename] 

Nun wird die Spalte DaysOfWeek werden Stringwerte der Tage Namen zurückzukehren, das heißt ‚Montag‘, ‚Dienstag‘ und so weiter.

Was, wenn ich wollte, dass die Abfrage die Ganzzahl 1 für "Montag", 2 für "Dienstag" usw. zurückgibt? Ich würde jedem der Wochentage in der SELECT Anweisung einen bestimmten Wert zuweisen wollen, aber ich bin mir nicht sicher, wie ich das machen soll.

Ich bin relativ neu in SQL, also dachte ich nur, ich würde nach einer intuitiven Methode fragen, um so eine Aufgabe zu erledigen.

Bearbeitet zu hinzufügen: Ich verwende nur Tage der Woche und ihre jeweiligen ganzzahlige Darstellung als ein einfaches Beispiel; Meine Aufgabe sind keine Wochentage, sondern Mitarbeiter-Codenummern und entsprechende Titel.

+1

Der normale Weg ist, die Integer-Werte an erster Stelle zu speichern. Hast du wirklich nur eine Schnur in deinem Tisch? Kannst du das reparieren? – hvd

+0

Ist DaysOfWeek eine Spalte in der Tabelle oder ist es eine gespeicherte Funktion? Es kann keine Variable sein. – Anand

+0

Bitte sehen Sie meine Bearbeitung - danke. @Anand, ich wollte sagen "Spalte". Ich werde das jetzt ändern. – daOnlyBG

Antwort

1

Sie können diese case mit tun:

SELECT (CASE DaysOfWeek 
      WHEN 'Monday' THEN 1 
      WHEN 'Tuesday' THEN 2 
      . . . 
     END) 

In den meisten Fällen ist es nicht notwendig, den Wochentag so zu speichern. Sie können die Funktion datepart() oder datename() verwenden, um den Wochentag aus einem Datums-/Uhrzeitwert zu extrahieren.

Wenn die Spalte in einer Tabelle ist, und nicht Teil eines Datums, dann könnten Sie die obige Logik als eine berechnete Spalte enthalten sein sollen:

alter table t add DayOfWeekNumber as (case DaysOfWeek when 'Monday' then 1 . . .); 
+1

'case' ist der operative Begriff, nach dem ich gesucht habe. Ich verstehe die Vorteile der Verwendung einer Referenztabelle, aber aus intellektueller Neugierde wollte ich wissen, wie man ein Code-Snippet innerhalb des Skripts verwenden kann, um dasselbe zu erreichen. Vielen Dank! – daOnlyBG

1

Wenn Sie Ihren eigenen entsprechenden Wert für einen anderen Wert definieren möchten, besteht der beste Weg darin, eine Tabelle zu verwenden und dieser Tabelle beizutreten.

Zum Beispiel:

create table dbo.EmployeeTitle (
    id int not null identity(1,1) primary key 
    , title varchar(32) 
); 

create table dbo.Employee (
    id int not null identity(1,1) primary key 
    , name nvarchar(128) 
    , title_id int references dbo.EmployeeTitle(id) 
); 

insert into dbo.EmployeeTitle values ('Big boss'); 
insert into dbo.Employee values ('daOnlyBG',1); 

select e.*, et.title 
from dbo.Employee e 
    inner join dbo.EmployeeTitle et 
    on e.title_id = et.id 

rextester Demo: http://rextester.com/FXIM78632

kehrt:

+----+----------+----------+----------+ 
| id | name | title_id | title | 
+----+----------+----------+----------+ 
| 1 | daOnlyBG |  1 | Big boss | 
+----+----------+----------+----------+ 
+0

Bitte sehen Sie meine Bearbeitung - danke. – daOnlyBG

1

Use-Case, haben here Sie die Definition und ein Beispiel:

select 
    CASE 
      WHEN(DaysOfWeek="Monday") THEN 1 
      WHEN(DaysOfWeek="Thusday") THEN 2 
      .... 
    ELSE -1 
from table 

Hoffe diese Hilfe!

0

Der einfachste Weg, den ich mir vorstellen kann, ist eine Tabellenvariable oder CTE; Erstellen Sie Ihre Suche als Zeilen und verbinden Sie sich damit. Etwas wie dieses:

with cte as (
    select 1 as emp_code, 'value1' as emp_title 
    union 
    select 2 as emp_code, 'value2' as emp_title 
    union 
    select 3 as emp_code, 'value3' as emp_title 
) 

select cte.emp_code, tableName.* 
from tableName 
inner join cte 
on cte.emp_title = tableName.some_column