2017-01-04 3 views
1

Я следующий SQL заявление:Проверьте, если значение столбца существует перед отборным

SqlCommand myCmd = new SqlCommand("select distinct(year(date_created)) as theYear from content where folder_id = 1 or folder_id = 2 order by theYear desc", myConn); 

Это заявление проверяет папки для любого контента затем устанавливает выпадающий список равного года. Однако, если в любой из этих папок нет содержимого, заявление выдается из строя. Это, очевидно, происходит каждый новый год, когда контент еще не создан. Простой ответ заключается в том, чтобы просто создать часть контента, которая устраняет проблему. Я хочу убедиться, что он настроен так, что никто не должен беспокоиться об этом, если что-то пойдет не так. Итак, есть ли способ проверить, есть ли значение в этом столбце, прежде чем он попытается выбрать.

Я попытался следующие:

SELECT DISTINCT (ISNULL(year(date_created), year(getdate()))) AS theYear 
FROM content 
WHERE folder_id = 1 
    OR folder_id = 2 
ORDER BY theYear DESC 

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

Может ли кто-нибудь сообщить мне, где я поступил не так, и каков будет правильный метод?

+2

Несвязанный, но: 'отчетный' - ** NOT ** a функция. Не используйте его, как один. –

+2

как вы назначаете выпадающее меню, не можете проверить логику там – TheGameiswar

+0

@a_horse_with_no_name Спасибо за разъяснение! Это был код, который был там, когда я получил его, и я не знал, что это неправильно. –

ответ

0

Ваш обновленный оператор по-прежнему будет применять предложение where, препятствующее возврату любых записей, NULL или иным образом.

select distinct 
    (ISNULL(year(date_created), year(getdate()))) as theYear 
from content 
where folder_id = 1 
    or folder_id = 2 
order by theYear desc 

Попробуйте изменить его

DECLARE @yearTbl TABLE 
(
    date_created DATE 
) 

INSERT @yearTbl 
SELECT date_created 
FROM content 
WHERE folder_id = 1 
    OR folder_id = 2 

IF (SELECT count(*) FROM @yearTbl) = 0 
    SELECT year(getdate()) AS theYear 
ELSE 
    SELECT DISTINCT year(date_created) AS theYear 
    FROM @yearTbl 
    ORDER BY theYear 
+0

С вашим ответом я лучше понял вопрос. Можно ли сделать то же самое только в одном выражении SELECT? – JotaPardo

1

Вы можете просто использовать UNION лавировать в текущем году на наборе данных. Поскольку UNION удаляет дубликаты это не имеет значения, если он уже существует в Content:

SELECT YEAR(date_created) AS theYear 
FROM Content 
WHERE folder_id IN (1, 2) 
UNION 
SELECT YEAR(GETDATE()) 
ORDER BY theYear DESC; 

Если вы хотите только текущий года появляться, если нет данных, то вы можете поставить и EXISTS проверки во втором запросе:

SELECT YEAR(date_created) AS theYear 
FROM Content 
WHERE folder_id IN (1, 2) 
UNION 
SELECT YEAR(GETDATE()) 
WHERE NOT EXISTS (SELECT 1 FROM Content WHERE folder_id IN (1, 2)) 
ORDER BY theYear DESC; 
+1

И что, если у него есть даты в date_created, но текущий год не существует в данных? Я понимаю, что только текущая дата должна появиться, если нет данных. – JotaPardo

+1

@ JotaPardo OK, я думаю, что неправильно понял. Я добавил предложение WHERE в исходный запрос, чтобы убедиться, что он отображается только там, где нет данных. – GarethD

+0

@GarethD Ваше первое заявление оказалось тем, что работало для меня. Он добавил 2017 к списку и не мешал ни одному из предыдущих лет, который должен быть там. Спасибо! –

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