2013-10-09 7 views
4

У меня запущен очень простой запрос, однако для некоторых результатов значение в одном поле равно нулю. Как я могу установить это значение в «строку», если его значение равно NULL?Установить значение по умолчанию в запросе, когда значение равно null

Что-то вроде

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    (Website IS NULL? 'no website' : Website) AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

Он будет работать на сервере SQL 2005

благодаря

+1

Посмотрите на 'ISNULL' или' функций COALESCE'. –

+0

Спасибо всем, что я приму ответ, как только это позволит мне –

ответ

15

Используйте следующее:

SELECT RegName, 
     RegEmail, 
     RegPhone, 
     RegOrg, 
     RegCountry, 
     DateReg, 
     ISNULL(Website,'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

или, как, @Lieven отметил:

SELECT RegName, 
     RegEmail, 
     RegPhone, 
     RegOrg, 
     RegCountry, 
     DateReg, 
     COALESCE(Website,'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 

Динамика COALESCE является то, что вы можете определить несколько аргументов, поэтому, если первый является нулевым, тогда получить второе, если второе является недействительным получить третий и т.д. и т.п ...

+0

взять с ISNULL, если вы перейдете на MySQL. Синтаксис отличается от http://www.w3schools.com/sql/sql_isnull.asp –

+0

Не относится к этому примеру, но, тем не менее, недостатком COALESCE является то, что он расширяется до оператора case, поэтому 'COALESCE ((SELECT Col FROM T), 'No Value') ', расширяется до' CASE WHEN (SELECT Col FROM T) НЕ ЯВЛЯЕТСЯ ТОЛЬКО (SELECT Something FROM Table) ELSE 'No Value' END' означает, что подзапрос выполняется дважды, если результат не является нулевым. ISNULL не проявляет такого поведения. Потенциал коалесценции заключается в том, что он находится в стандарте ANSII, ISNULL() - нет. – GarethD

1

Вы просто использовать ISNULL(website, 'yourstring').

Таким образом, ваш запрос будет как:

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    ISNULL(website, 'no website') AS WebSite 
FROM RegTakePart 
WHERE Reject IS NULL 
+0

Независимо от того, какой ответ вы выберете, все они будут работать. «COALESCE» и «ISNULL» - оба решения. –

3

Использование CASE:

SELECT regname, 
     regemail, 
     regphone, 
     regorg, 
     regcountry, 
     datereg, 
     CASE 
     WHEN website IS NULL THEN 'no website' 
     ELSE website 
     END AS WebSite 
FROM regtakepart 
WHERE reject IS NULL 

или COALESCE:

.... 
COALESCE(website, 'no website') AS WebSite 
.... 
2

Как было отмечено выше, является предпочтительным решением сливаются. В качестве дополнительного преимущества, вы можете использовать COALESCE против «производного» значения по сравнению с выбранным значением, как в:

SELECT 
     {stuff}, 
     COALESCE((select count(*) from tbl where {stuff}), 0) AS countofstuff 
FROM 
     tbl 
WHERE 
     {something} 

Использование «IIF» или «дело», вам нужно будет повторить встроенный в то время как с COALESCE вы нет, и это позволяет избежать «нулевой» результат в том, что возвращение ...

+0

Первым аргументом 'COALESCE' с'() 'очень важно, или запрос не будет компилироваться. Спасибо тебе за это –

0

чтобы избежать некоторых проблем другим пользователям:

Задача 1 + Решение:

Если вы планируете для использования ISNULL с базой данных доступа, имейте в виду, что функция ISNULL, реализованная в Access, отличается от реализации SQL Server.

Доступ ISNULL Функция всегда возвращает TRUE или FALSE. Таким образом, вы должны использовать пользовательскую функцию IIF вокруг вашего использования ISNULL.

Задача 2 + Решение:

Кроме того, если вы хотите использовать то же имя поля в качестве псевдонима для столбца, это может привести к базе данных Access Engine, чтобы сообщить вам, что есть "циклическая ссылка "в поле.

Поэтому, если вам нужно использовать то же имя поля, что и Alias, вам просто нужно добавить имя таблицы перед именем поля. (пример: вы должны использовать RegTakePart.Website вместо просто Website). Таким образом, вы можете свободно использовать Website в качестве псевдонима для своего столбца.

Глобальная рабочая (и испытания) SQL-запрос, чтобы избежать этих 2 проблемы заключается в следующем:

SELECT RegName, 
    RegEmail, 
    RegPhone, 
    RegOrg, 
    RegCountry, 
    DateReg, 
    IIF(RegTakePart.Website IS NULL, 'no website, RegTakePart.Website) AS Website 
FROM RegTakePart 
WHERE Reject IS NULL 
Смежные вопросы