2016-05-18 18 views
0

Wie Encapsulate zwischen Anweisung in SQL Server.Wie Encapsulate zwischen Anweisung in SQL Server

Ich habe eine Menge Code zu refactor, die lange Liste von Where-Klauseln mit der gleichen Between-Anweisung, die magische Zahlen haben, und ich möchte es umgestalten. Es ist möglich, BETWEEN zu kapseln.

Beispiel: Die Abfrage hat etwas ähnliches wie diese, und es gibt nicht die Möglichkeit dies nur ein einfaches Beispiel kommen zu zeigen, dass ich etwas in dem haben möchte, wenn dies nicht ist, die zwischen

SELECT ... 
FROM Table0 
WHERE Id BETWEEN 3456 AND 15500; 

... 

SELECT ... 
FROM Table1 
WHERE Id BETWEEN 3456 AND 15500; 

... 
SELECT ... 
FROM Table2 
WHERE Id BETWEEN 3456 AND 15500; 
+0

Können Sie sich auf, was Sie in diesem Zusammenhang von encapsulate bedeuten? Wenn Sie dieselben hartcodierten Werte nicht ständig wiederverwenden möchten, sollten Sie sie in Variablen speichern und die Variablen in Ihren Abfragen verwenden. Dies würde im Wesentlichen erlauben, sie in einem einzigen Bereich zu definieren. –

+0

Die Kapselung, die ich suche, ist vielleicht nicht möglich, weil ich in Java und C# denke, um den Code zu organisieren. Ich möchte etwas mit dem gleichen Effekt, dass in C# eine lange ändern, wenn (x> 3456 & & x <15500) für if (IsValidId) wo IsValid => (x> 3456 & & x <15500). Also ein WHERE IsValid. Diese Art der Kapselung, nach der ich suche, bin mir aber nicht sicher, ob SQL diese Idee zulässt. – Devsined

Antwort

0

sein Wenn Sie eine Funktion wollen Sie es tun können.

create function dbo.isValid(val int) 
returns int 
as 
begin 
if val BETWEEN 3456 AND 15500 
    return 1 
return 0 
end 

Und offensichtlich Nutzung:

select * from table1 
where dbo.isValid(id) = 1 
0

Wiederholung Sie könnten versuchen,

SELECT * 
FROM 
(
    SELECT .... 
    FROM table1 
    UNION ALL 
    SELECT .... 
    FROM table2 
    UNION ALL 
    SELECT .... 
    FROM table3 
) 
WHERE Id BETWEEN 3456 AND 15500; 
1

Wie @Rion die entweder Variablen erstellen oder einen seperaten Tabelle

CREATE TABLE check_range 
    ("range_id" int, "begin" int, "end" int) 
; 

INSERT INTO check_range 
    ("range_id", "begin", "end") 
VALUES 
    (1, 3456, 15500) 
; 
verwenden

Dann sollten Sie Ihre Abfrage

SELECT ... 
FROM Table0 
CROSS JOIN check_range cr 
WHERE Id BETWEEN cr.begin AND cr.end; 
+0

Dies ist eine interessante Lösung nicht genau das, was ich suche, aber gute Alternative – Devsined