2015-11-20 2 views
1

У меня есть таблица с именем Users с столбцом Limit, который содержит целочисленные значения. У каждого пользователя есть ограничение, но у незарегистрированных пользователей предел по умолчанию равен 1.SQL Server ISNULL/Coalesce все еще возвращает пустые списки

Я хочу запустить простой запрос, который сообщает мне лимит для пользователя, если он зарегистрирован или по умолчанию равен 1, если они не зарегистрированы пользователей, однако при запуске запроса с любой ISNULL или Coalesce как написано ниже:

SELECT coalesce(Limit,1) AS limit 
FROM User 
WHERE userID = 'testUser' 

запрос будет работать нормально, если я запрос на существующего пользователя, но возвращает пустой список, если я пытаюсь незарегистрированного пользователя [он должен возвращать одну строку со значением 1].

Использование ISNULL вместо coalesce дает тот же результат. Каждый пример, который я нашел из ISNULL и coalesce, выглядит таким образом. Что мне не хватает?

+1

структура Share таблицы и примеры данные. Я предполагаю, что ваш запрос не возвращает строку для незарегистрированных пользователей, поэтому все работает так, как должно. – lad2025

+1

Похоже, что пользователь не существует в таблице «Пользователь». Что возвращает простой 'SELECT *' для указанного идентификатора пользователя? –

+0

Незарегистрированные пользователи не существуют в таблице «Пользователи». В частности, я бы использовал их IP как userID [это будет храниться в другой таблице для других целей] – ConnorU

ответ

6

coalesce действует на возвращаемое значение и оценивает, является ли оно null или нет. В вашем случае несуществующий просто не имеет строки, поэтому, как вы отметили, это не сработает.

Вы можете, однако, эмулировать это поведение с левой присоединиться:

SELECT COALESCE(b_limit, a_limit) AS limit 
FROM  (SELECT 1 AS a_limit) a 
LEFT JOIN (SELECT limit AS b_limit 
      FROM user 
      WHERE userID = 'testUser') b ON 1 = 1 
+0

'COALESCE (a_limit, b_limit)' всегда будет возвращаться 1. Измените порядок внутри 'COALESCE' – lad2025

+1

@ lad2025 eap! В самом деле! Спасибо, что заметили. С моей стороны это было неосторожно. – Mureinik

+0

Я получаю неправильный синтаксис возле 'b'. ошибка...? – ConnorU

-1

может быть, что .. если подзапрос результат является нулевым, то результатом является 1

SELECT coalesce((SELECT Limit 
        FROM User 
        WHERE userID = 'testUser'), 1) AS limit 
+0

Это интересный подход. На первый взгляд казалось, что это не сработает, но поскольку выбор, возвращающий строку, не является подзапросом, как столбец, он будет работать. –

+0

Если подзапрос не возвращает значение строки, значение NULL и результат COALESCE равен 1 –

Смежные вопросы