Трюк дня. COALESCE() для перезаписи NULL
При помощи функции COALESCE() можно перезаписать NULL на другое значение:
Запрос вернёт значение ‘missing‘ для всех строк таблицы, где null_var IS NULL
В mssql это делает функция isnull(null_var,'missing')
#tips
@sqlhub
При помощи функции COALESCE() можно перезаписать NULL на другое значение:
SELECT
id,
null_var,
COALESCE(null_var, 'missing') AS recode_null_var
FROM
current_table
ORDER BY id
Запрос вернёт значение ‘missing‘ для всех строк таблицы, где null_var IS NULL
В mssql это делает функция isnull(null_var,'missing')
#tips
@sqlhub
👍9
Трюк дня. Агрегирование записей в PostgreSQL
Таблица
Разница между датой окончания (
Напишите запрос, возвращающий даты начала и окончания каждого проекта, а также количество дней, затраченных на его выполнение. Расположите их в порядке возрастания продолжительности проекта, а в случае равенства - по возрастанию даты начала.
Код создания view исходной таблицы projects здесь.
Решение будет вечером.
#tips
Таблица
projects
содержит три столбца: task_id, start_date
и end_date
. Разница между датой окончания (
end_date
) и датой начала (start_date
) составляет 1 день для каждой строки таблицы. Если даты окончания задач последовательны, они являются частью одного проекта. Даты проектов не пересекаются.Напишите запрос, возвращающий даты начала и окончания каждого проекта, а также количество дней, затраченных на его выполнение. Расположите их в порядке возрастания продолжительности проекта, а в случае равенства - по возрастанию даты начала.
Код создания view исходной таблицы projects здесь.
Решение будет вечером.
#tips
👍3
Трюк дня. Агрегирование записей в PostgreSQL. Решение
WITH projects (task_id, start_date, end_date)
AS (VALUES
(1, CAST('10-01-20' AS date), CAST('10-02-20' AS date)),
(2, CAST('10-02-20' AS date), CAST('10-03-20' AS date)),
(3, CAST('10-03-20' AS date), CAST('10-04-20' AS date)),
(4, CAST('10-13-20' AS date), CAST('10-14-20' AS date)),
(5, CAST('10-14-20' AS date), CAST('10-15-20' AS date)),
(6, CAST('10-28-20' AS date), CAST('10-29-20' AS date)),
(7, CAST('10-30-20' AS date), CAST('10-31-20' AS date))),
-- получим такие даты начала, которых не существует в колонке даты окончания (это 'настоящие' даты начала проекта)
t1 AS (
SELECT start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects) ),
-- получим такие даты окончания, которые не существуют в колонке дат начала (это 'настоящие' даты окончания проекта)
t2 AS (
SELECT end_date
FROM projects
WHERE end_date NOT IN (SELECT start_date FROM projects) ),
--отфильтруем допустимые пары начало-окончание (начало < окончание), затем найдем правильную дату окончания для каждой даты начала (минимальная дата окончания, поскольку нет пересекающихся проектов)
t3 AS (
SELECT
start_date,
MIN(end_date) AS end_date
FROM t1, t2
WHERE start_date < end_date
GROUP BY 1 )
SELECT
*,
end_date - start_date AS project_duration
FROM t3
ORDER BY 3, 1
#tips🥰2🤔2😢1
Как сделать Case Sensitive сравнение в MySQL. Решение
Небинарные строки (CHAR, VARCHAR, TEXT) в MySQL по умолчанию не чувствительны к регистру. Поэтому запрос
Для вывода только одной записи с ‘SPG’ существуют следующие решения:
1. Приведение столбца к типу
2. Выбор чувствительного к регистру набора символов с помощью
Детальную документацию смотрите здесь.
#tips
@sqlhub
Небинарные строки (CHAR, VARCHAR, TEXT) в MySQL по умолчанию не чувствительны к регистру. Поэтому запрос
SELECT * FROM enterprise WHERE company = ‘SPG‘
выведет все три строки. Для вывода только одной записи с ‘SPG’ существуют следующие решения:
1. Приведение столбца к типу
BINARY
(т.к. тип BINARY чувствителен к регистру): SELECT * FROM enterprise WHERE BINARY company = ‘SPG‘;
2. Выбор чувствительного к регистру набора символов с помощью
COLLATE
:SELECT * FROM enterprise WHERE company COLLATE utf8mb4_0900_as_cs = ‘SPG‘;
Детальную документацию смотрите здесь.
#tips
@sqlhub
❤6👍1🔥1
Трюк дня. Возвратить 0 для функции
Перепишите запрос так, чтобы он возвратил 0, если для функции SUM не найдено ни одного значения, кроме
И возвратил сумму, если значения найдены.
#tips
SUM
если не найдено ни одного значения в MySQL Перепишите запрос так, чтобы он возвратил 0, если для функции SUM не найдено ни одного значения, кроме
NULLs
. И возвратил сумму, если значения найдены.
SELECT SUM (column_1)
FROM table
WHERE column_2 = ‘Test‘;
Решение будет вечером. #tips
👍11
Трюк дня. Количество вхождений строки в поле в MySQL
Есть таблица
Напишите MySQL запрос, который подсчитает количество вхождений значения ‘
Ожидаемый результат:
Решение:
#tips
@sqlhub
Есть таблица
items
со следующими данными:id desc
1 val test test val
2 val test
3 test test test
4 valvalvalvalval
Напишите MySQL запрос, который подсчитает количество вхождений значения ‘
val
‘ для каждого desc
. Ожидаемый результат:
2
1
0
5
Решение:
SELECT
ROUND (
(LENGTH (desc) - LENGTH (
REPLACE (desc, ‘val‘,‘‘)
)) / LENGTH(‘val‘)) AS c
FROM items;
#tips
@sqlhub
👍13❤1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
В Oracle Database используйте:
CREATE TABLE ... ( <col> <datatype> DEFAULT ON NULL <expr> )
Если при
INSERT
опустить <col>
или поместить в него NULL
, то база данных использует вместо него <expr>
по умолчанию.#sql #tips #junior
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥰3❤2🔥1