Правильно составить запрос

Olivka
Дата: 15.02.2013 17:42:54
У предмета есть четыре характеристики, выраженные целыми числами.
В таблице aTable_1 представлен некий фильтр этих характеристик - те же четыре целых числа, либо нулевые значения. Если в таблице стоит 0, то подходит любая характеристика предмета, если число - то только указанная.
Например:
х1 х2  х3  х4  N
0 2 0 0 10
1 0 0 5 25

предмет с характеристикой
100 2 3 8
подходит под первый фильтр, и в результате запроса я хочу получить число N (10)
предмет с характеристикой
1 2 3 5
подходит под оба фильтра, и в результате я хочу получить число 25 как максимальное из всех подходящих N.

запросы для создания таблицы и заполнения
CREATE TABLE [aTable_1](
	[x1] [int] NULL,
	[x2] [int] NULL,
	[x3] [int] NULL,
	[x4] [int] NULL,
	[N] [numeric](18, 0) NULL
) ON [PRIMARY]


INSERT INTO [aTable_1]
           ([x1]
           ,[x2]
           ,[x3]
           ,[x4]
           ,[N])
     VALUES
           (0,2,3,0,10)
INSERT INTO [aTable_1]
           ([x1]
           ,[x2]
           ,[x3]
           ,[x4]
           ,[N])
     VALUES
           (1,0,0,5,25)
Glory
Дата: 15.02.2013 17:52:44
Olivka
и в результате я хочу получить число 25 как максимальное из всех подходящих N.

И в чем проблема ?
TOP 1 + ORDER BY N desc
Olivka
Дата: 15.02.2013 17:54:01
Glory,

Мне нужно проверить какому именно фильтру удовлетворяют произвольно заданные характеристики предмета. Отсортировать я умею.
Glory
Дата: 15.02.2013 18:02:16
Olivka
Мне нужно проверить какому именно фильтру удовлетворяют произвольно заданные характеристики предмета. Отсортировать я умею.

И что мешает проверять то ? Вы не можете сравнить значение в таблице с "произвольно заданными характеристиками предмета" ?
Гость333
Дата: 15.02.2013 18:05:48
Olivka,

DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 2, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x3 = a.x3 OR a.x3 = 0)
ORDER BY a.N DESC;

SELECT @x1 = 1, @x2 = 2, @x3 = 3, @x4 = 5;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x3 = a.x3 OR a.x3 = 0)
ORDER BY a.N DESC;
Гость333
Дата: 15.02.2013 18:07:12
Ошибся при копипасте :-)
DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 2, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;

SELECT @x1 = 1, @x2 = 2, @x3 = 3, @x4 = 5;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;
Olivka
Дата: 15.02.2013 18:18:45
Гость333,

Спасибо!
Тут один случай не проходит, если характеристики заданы неполно, например

DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 0, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;


должно выдавать 10-ку

Я вот так переписала
DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 0, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0 OR @x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0 OR @x2 = 0) 
AND (@x3 = a.x3 OR a.x3 = 0 OR @x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0 OR @x4 = 0)
ORDER BY a.N DESC;


Как-то очень просто все, мне казалось должно быть сложнее.. )