Простой запрос SELECT с равным или не равным значению - PullRequest
0 голосов
/ 10 февраля 2012

Допустим, у меня есть эта таблица,

A    B
-------
1    A
2    C
3    A
4    NULL
5    B
6    A

У меня есть только один параметр в хранимой процедуре. Мне нужно передать один параметр @param. Мне нужно выбрать все строки, равные A или выбрать все строки, не равные A. У меня только один параметр @param. Если @param = 'A', выберите все строки с помощью A, а если @param <> 'A', выберите все строки, не равные A.

Изменить:

Вот 1 подход, который я нашел. Не уверен, какой подход лучший .

DECLARE @Param VARCHAR(5)='NOt A'

DECLARE @tbl TABLE(A INT,B VARCHAR(5))

INSERT INTO @tbl(A,B)
VALUES
    (1,'A'),
    (2,'C'),
    (3,'A'),
    (4,NULL),
    (5,'B'),
    (6,'A')

SELECT  * 
FROM    @tbl 
WHERE 1 = 
        (
            CASE    WHEN @param = 'A' 
                    THEN 
                    (
                        CASE WHEN B = 'A' THEN 1 ELSE 2 END
                    ) 
                    ELSE 
                    (
                        CASE WHEN (B IS NULL OR B <> 'A') THEN 1 ELSE 2 END
                    ) 
                    END
        ) 

Ответы [ 4 ]

4 голосов
/ 10 февраля 2012

Так что, если я вас правильно понимаю, вы в основном хотите выбрать все строки, равные A, если значение @param действительно A - и все остальные строки, если оно не A ??

Что-то вроде:

 CREATE PROCEDURE dbo.SelectRows @Param CHAR(1)
 AS 
 BEGIN
   IF @Param = 'A' THEN

     SELECT A, B
     FROM dbo.YourTable
     WHERE B = 'A'

   ELSE

     SELECT A, B
     FROM dbo.YourTable
     WHERE B <> 'A' OR B IS NULL

 END 
2 голосов
/ 10 февраля 2012

Подход, предложенный marc_s , является наиболее понятным и простым в обслуживании и оптимизирует запрос.Если вы настаиваете на том, чтобы сделать это в одном утверждении, вы можете сделать что-то вроде следующего:

select A, B
from @tbl  
where ((@Param='A') and (B='A'))
   or ((@Param<>'A') and ((B<>'A') or (B is null)))
1 голос
/ 10 февраля 2012

Может быть что-то вроде этого:

Сначала некоторые тестовые данные:

DECLARE @tbl TABLE(A INT,B VARCHAR(5))

INSERT INTO @tbl(A,B)
VALUES
    (1,'A'),
    (2,'C'),
    (3,'A'),
    (4,NULL),
    (5,'B'),
    (6,'A')

Затем запрос, подобный этому:

DECLARE @Param VARCHAR(5)='A'

SELECT
    *
FROM
    @tbl AS tbl
WHERE EXISTS
    (
        SELECT
            1
        FROM
            @tbl AS tbl2
        WHERE
            @Param='A'
            AND tbl2.B=@Param
            AND tbl.A=tbl2.A
        UNION ALL
        SELECT
            1
        FROM
            @tbl AS tbl3
        WHERE
            (NOT @Param='A' OR @Param IS NULL)
            AND (tbl.B<>'A' OR tbl.B IS NULL)
            AND tbl.A=tbl3.A
    )
1 голос
/ 10 февраля 2012

Вы можете попробовать что-то вроде этого. Пожалуйста, попробуйте изменить этот запрос, вы можете получить результат.

  SELECT A, B
         FROM dbo.YourTable
         WHERE B IN (CASE WHEN @Param='A' THEN 'A' ELSE
                        (SELECT B FROM yourTable where B<>'A' OR B IS NULL) END)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...