Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
theMoL
7 / 7 / 2
Регистрация: 09.10.2011
Сообщений: 30
1

Возможно ли такое условие в запросе?

19.12.2011, 11:39. Просмотров 1917. Ответов 7
Метки нет (Все метки)

ЕСЛИ значение содержит '?' ТОГДА
строка подходит если количество дочерних строк > 0
ИНАЧЕ
значение подходит если оно > 10
КОНЕЦЕСЛИ;

Привер:
SQL
1
2
3
4
5
6
WHERE 
  IF ([DAY] LIKE '%?%')
     (COUNT(SELECT * FROM tbl1 WHERE (parentID = ID)) > 0)
  ELSE
     (([DAY] AS INT) > 10)
  END IF;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 11:39
Ответы с готовыми решениями:

Условие в запросе
Здравствуйте. Подскажите как можно реализовать следующее. Имеется таблица...

Динамическое условие в запросе
Есть хранимая процедура с параметром ALTER PROCEDURE . @IsCity bit = 1 в...

Возможно ли такое?
select sum(a.stoim), (b.lastname ||' '|| b.name||' '||b.otchestvo) as fio...

Возможно ли присвоить переменной значение в SQL-запросе
Коллеги, помогите новичку. Возможно ли в теле запроса присвоить значение...

Свести таблицы по подстрокам, возможно ли такое?
Здравствуйте! Подскажите, пожалуйста, возможно ли на чистом SQL (MSSQL 2012...

7
homich77
79 / 78 / 4
Регистрация: 06.04.2009
Сообщений: 326
19.12.2011, 19:57 2
не if а case

Добавлено через 1 минуту
Цитата Сообщение от theMoL Посмотреть сообщение
SELECT * FROM tbl1
лучше указывать конкретно поле, к примеру ID этой таблицы - так быстрее будет обрабатываться запрос Видно это конечно при больших данных, но чтобы знали
1
theMoL
7 / 7 / 2
Регистрация: 09.10.2011
Сообщений: 30
20.12.2011, 12:13  [ТС] 3
Спс, Получилось)).
Вот что получилось: //? - подразумевает наличие цифры, но плохочитаемой или совсем не читаемой
Данные:
-даблица с датами
IDYear
1 1942
8 195?
2 1945
3 194?
5 19??
7 1943
-таблица с вариантами значений
IDParentIDBeginVariantEndVariant
1 3 1940 1949
1 5 1900 1999
1 8 1950 1959

К примеру нам необходимо отобрать все даты с периода 1942-1943
Делаем запрос:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
    [ID],
    [YEAR]
FROM 
    [TestDate] AS td
WHERE 
    1 = 
    CASE 
        WHEN [YEAR] LIKE '%?%' THEN 
            (SELECT COUNT(ID) FROM [TestDateSubTable] AS std
            WHERE (std.[ParentID] = td.ID) AND ((1942 BETWEEN [BeginVariant] AND [EndVariant]) OR (1943 BETWEEN [BeginVariant] AND [EndVariant])))
        WHEN [YEAR] NOT LIKE '%?%' THEN 
            CASE 
            WHEN [YEAR] BETWEEN 1942 AND 1943 THEN 1
            END
    END
GO
Получим
IDYear
1 1942
3 194?
5 19??
7 1943
Есть ли ошибки в запросе?
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2011, 12:24 4
Цитата Сообщение от theMoL Посмотреть сообщение
ЕСЛИ значение содержит '?' ТОГДА
строка подходит если количество дочерних строк > 0
ИНАЧЕ значение подходит если оно > 10
КОНЕЦЕСЛИ;
Что такое "дочерние строки"? Первая нормальная исключает вертикальное объединение ячеек, а остальные наследуют от неё. Или имеется ввиду, что в другой таблице есть связанные записи и ты хочешь проверить наличие записей, связанных с каждой конкретной записью данной таблицы. Тогда запрос на выборку представления составного кортежа, то есть прямо так, из обеих таблиц с учётом связи, во второй таблице достаточно указать только внешний ключ, в выборке будут только не пустые строки, в каждой её строке есть данные из обеих таблиц, если же тебе нужна именно только данная таблица, то дальше укажи его фромом для второго запроса, а в нём пропиши группировку по первичному ключу. Это и будет решение "в лоб".
0
theMoL
7 / 7 / 2
Регистрация: 09.10.2011
Сообщений: 30
20.12.2011, 12:27  [ТС] 5
В предшествующем ответе есть полная картина. Моя ошибка - необходимо было полнее и яснее написать условие
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2011, 12:37 6
То есть так:
SQL
1
2
3
4
SELECT w1.t1.q1, MIN(w1.q2) AS [Min-q2]
FROM SELECT t1.q1, t1.q2, t2.q1
FROM t1 INNER JOIN t2 ON t1.q1 = t2.q1
GROUP BY w1.t1.q1;
попробуй. Только аксес сказал, что достаточно
SQL
1
2
3
SELECT t1.q1, MIN(t1.q2) AS [Min-q2]
FROM t1 INNER JOIN t2 ON t1.q1 = t2.q1
GROUP BY t1.q1;
Min не обязателен, это просто причуда аксеса, он хочет, чтоб если в конструкторе есть групповые операции, то для всех полей сразу. Этот вариант протестирован.
0
homich77
79 / 78 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.12.2011, 11:58 7
Цитата Сообщение от theMoL Посмотреть сообщение
WHERE
1 =
CASE
А зачем вы сравниваете с единицей?
0
theMoL
7 / 7 / 2
Регистрация: 09.10.2011
Сообщений: 30
22.12.2011, 10:16  [ТС] 8
Мне выдавало такую ошибку
Рядом с "END" в контексте, где ожидается условие, указано выражение типа, отличного от логического.
Case возвращает значение, а сравнивать не с чем. Решил поступить таким образом
Может подскажете как поступить правильно?
0
22.12.2011, 10:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2011, 10:16

Как использовать поле одной таблицы в запросе и как условие в подзапросе?
Привет всем. Ситуация такая: Использую одну и ту же таблицу в запросе и...

Условие в запросе
хотя бы у одного из них - как это составить в SQL запросе?

Условие в запросе
Помогите, пожалуйста!!! Я пишу отчет, который должен выводить таблицу с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru