Можно ли заменить значения в запросе SQL? - PullRequest
5 голосов
/ 02 августа 2011

Я хотел бы знать, возможно ли в запросе SQL заменить некоторые значения чем-то другим, или мне нужно сделать это в постобработке.

Позвольте мне объяснить.У меня есть эта таблица:

|username| accepted |
|--------|----------|
|  toto  |   NULL   |
|--------|----------|
|  foo   |    0     |
|--------|----------|
|  Rick  |    1     |
|--------|----------|
|  bar   |    1     |
|--------|----------|

Я хочу знать количество строк на значение accepted (обнуляемый бит).Я выполняю этот запрос:

SELECT [accepted], count(*) FROM my_table GROUP BY [accepted]

Что должно вернуть:

NULL   1  
false  1  
true   2

Есть ли какой-нибудь способ заменить значения accepted на более значимые метки?В идеале я хотел бы иметь что-то вроде:

not_available 1
not_accepted  1
accepted      2

Это возможно с SQL Server 2008 R2?

Thx.

Ответы [ 4 ]

11 голосов
/ 02 августа 2011

Если у вас есть несколько значений:

SELECT CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted '
ELSE 'not_available' END AS accepted
, count(*) 
FROM my_table 
GROUP BY CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted '
ELSE 'not_available' END
3 голосов
/ 02 августа 2011

Использовать CASE

SELECT
    CASE [accepted]
       WHEN 1 THEN 'accepted'
       WHEN 0 THEN 'not_accepted'
       ELSE 'not_available' --NULL
    END AS [accepted], count(*)
FROM my_table
GROUP BY --try [accepted] by itself first
    CASE [accepted]
       WHEN 1 THEN 'accepted'
       WHEN 0 THEN 'not_accepted'
       ELSE 'not_available' --NULL
    END

Возможно, вам придется использовать весь CASE в GROUP BY.Если вы не сделаете это

SELECT
    CASE [accepted]
       WHEN 1 THEN 'accepted'
       WHEN 0 THEN 'not_accepted'
       ELSE 'not_available' --NULL
    END AS [accepted], CountOfAccepted
FROM
   (SELECT [accepted], count(*) AS CountOfAccepted
    FROM my_table GROUP BY [accepted]) foo
2 голосов
/ 02 августа 2011
SELECT
    CASE [accepted]
        WHEN 1 THEN 'accepted', 
        WHEN 0 THEN 'not accepted',
        ELSE 'not available'
    END AS [accepted],
    count(*) 
FROM my_table GROUP BY [accepted]

Не уверен, что это правильно, и нет SQL Server, доступного для тестирования сейчас, но должно быть что-то вроде этого.

РЕДАКТИРОВАТЬ: AWW, уже опубликовано

1 голос
/ 02 августа 2011

да, он есть ... вы можете изменить свой запрос, как показано ниже -

SELECT decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted'),count(*) 
FROM my_table GROUP BY 
 decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted')

он должен выдавать вывод, как вы хотите.

может быть, тогда функции декодирования не будетВы можете использовать case там ..

SELECT 
case accepted 
    WHEN 1 THEN 'accepted'
    WHEN 0 THEN 'not_accepted'
    ELSE 'not_available' 
end,count(*) 
    FROM my_table GROUP BY     
 case accepted 
    WHEN 1 THEN 'accepted'
    WHEN 0 THEN 'not_accepted' 
    ELSE 'not_available' end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...