всегда возвращать некоторые строки в UNION, даже если условие не соответствует - PullRequest
0 голосов
/ 29 марта 2012

У меня есть сохраненный процесс, который объединяет некоторые данные и возвращает обратно. В максимуме этот SP вернет мне 3 строки, соответствующие условию where.

Можно ли заставить СП вернуть пустую строку, если нет данных, соответствующих условию?

Вот так выглядит мой SP:

SELECT Top 1 Col1, 'FirstResult' FROM Table T1
       where SomeColumn='whatever'

UNION ALL

SELECT Top 1 Col2, 'SecondResult' FROM Table T1
       where SomeColumn='whatever'

UNION ALL

SELECT Top 1 Col3, 'ThirdResult' FROM Table T1
       where SomeColumn='whatever'

Я хочу всегда возвращать мне 3 строки, даже если условие не совпадает. Конечно, данные будут пустыми или NULL в наборе результатов.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Вы можете пойти сюда, чтобы продемонстрировать, что запрос в этом ответе работает без строк: http://www.sqlfiddle.com/#!3/51d1c/3

С 1 строкой в ​​YourTable: http://www.sqlfiddle.com/#!3/ad1e8/1

Вот процедура, которая должна вернуть то, что вы ищете:

CREATE PROCEDURE pExample_Get3ForcedRows
    @FirstMatch VARCHAR(50)
    ,@SecondMatch VARCHAR(50)
    ,@ThirdMatch VARCHAR(50)
AS
BEGIN

DECLARE @ForceTable TABLE
(
    MatchColumn VARCHAR(50) NOT NULL
)

INSERT @ForceTable (MatchColumn) VALUES (@FirstMatch),(@SecondMatch),(@ThirdMatch)

SELECT
    T.Col1
    , T.ResultColumn
FROM @ForceTable F
LEFT JOIN YourTable T
    ON T.SomeColumn = F.MatchColumn

END
GO
0 голосов
/ 29 марта 2012
DECLARE @table (Col1 varchar, String2 varchar)

IF ( (SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0 )
  INSERT INTO @table
  SELECT Top 1 Col1, 'FirstResult' FROM Table T1 WHERE SomeColumn='whatever'
ELSE
  INSERT INTO @table
  SELECT NULL AS Col1, ''

IF ( (SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0 )
  INSERT INTO @table
  SELECT Top 1 Col2, 'secondResult' FROM Table T1 WHERE SomeColumn='whatever'
ELSE
  INSERT INTO @table
  SELECT NULL AS Col2, ''

IF ( (SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0 )
  INSERT INTO @table
  SELECT Top 1 Col3, 'thirdResult' FROM Table T1 WHERE SomeColumn='whatever'
ELSE
  INSERT INTO @table
  SELECT NULL AS Col3, ''

RETURN @table

Не знаю, есть ли более элегантная версия, но это должно работать.

...