Получение двух значений из хранимой процедуры - PullRequest
1 голос
/ 22 сентября 2009

Может кто-нибудь сказать мне, как я могу объединить два оператора SQL, которые подсчитывают количество сообщений и количество непрочитанных сообщений? У его неэффективных двух есть два утверждения, но я не знаю, что искать, чтобы получить ответ, который я ищу. Заранее спасибо.

CREATE PROCEDURE dbo.GetMessages (
  @username nchar(12),
  @isCount bit,
  @message_count int OUTPUT,
  @unread_message_count int OUTPUT
) AS

IF @isCount = 1
BEGIN
  SET @message_count = 
  (
    SELECT        COUNT(*)
    FROM          messages
    WHERE         usernameTo = @username
  )

  SET @unread_message_count =
  (
    SELECT        COUNT(*)
    FROM          messages
    WHERE         usernameTo = @username AND message_read = 1
  )
END
ELSE
BEGIN
  SELECT        *
  FROM          messages
  WHERE         usernameTo = @username
END

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

Во-первых, вы хотите, чтобы это было разделено на две хранимые процедуры. Если вы когда-либо используете бит для определения того, какой фрагмент кода выполнять, вы, вероятно, пытаетесь поместить слишком много в одну хранимую процедуру.

CREATE PROCEDURE dbo.GetMessageCount (
  @username nchar(12),
  @message_count int OUTPUT,
  @unread_message_count int OUTPUT
) AS

SELECT
    @message_count = SUM(CASE WHEN message_read = 1 THEN 1 ELSE 0 END),
    @unread_message_count = SUM(CASE WHEN message_read <> 1 THEN 1 ELSE 0 END)
FROM messages
WHERE usernameTo = @username

GO

Вы можете сделать что-то подобное для хранимой процедуры, которая будет получать все сообщения для определенного пользователя. Вы не хотите использовать «Выбрать *» здесь. Вы должны всегда перечислять конкретные столбцы, которые вам нужны. Я перечислил несколько примеров столбцов.

CREATE PROCEDURE dbo.GetMessagesByUser (
    @username nchar(12)
) AS

  SELECT
      MessageID,
      MessageSubject,
      MessageContent,
      MessageFromUser,
      MessageCreatedDate
  FROM          messages
  WHERE         usernameTo = @username

GO
2 голосов
/ 22 сентября 2009
select count(*) as TotalCount, 
    count(case when message_read = 1 then 1 else null end) as ReadMessageCount, 
    count(case when message_read <> 1 then 1 else null end) as UnreadMessageCount
from messages
where usernameTo = 'jsmith'
1 голос
/ 22 сентября 2009

Это зависит от используемого вами SQL, но, например, в PostgreSQL это будет выглядеть так:

SELECT
    COUNT(*) AS messages,
    COUNT( CASE WHEN message_read=1 THEN 1 ELSE NULL END ) AS unreads,
    COUNT( CASE WHEN message_read=1 THEN NULL ELSE 1 END ) AS reads
FROM messages WHERE usernameTo='someone';

Это должно помочь.

0 голосов
/ 22 сентября 2009
SELECT COUNT(*) AS total_messages,      
       SUM(CASE WHEN message_read=1 THEN 1 END) as read, 
       SUM(CASE WHEN message_read=0 THEN 1 END) as unread
FROM mesages WHERE usernameTo='username';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...