Сортування і форматування — це логічно і корисно. Але іноді можна випадково заплутатись і отримати неочікувані результати. Давай разом розберемо найпоширеніші помилки, щоб твої дані завжди виглядали ідеально і йшли у правильному порядку!
1. Сортування даних різних типів
Уяви собі ситуацію: ти сортуєш таблицю по стовпцю, який містить суміш чисел і рядків. PostgreSQL, звісно, спробує допомогти, але результат може тебе здивувати. Наприклад, у тебе є таблиця, де value — текст:
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
І ти пишеш запит:
SELECT *
FROM mixed_data
ORDER BY value;
Очікуваний результат? Може бути: 2, 10, 20, apple? Ні, PostgreSQL сортує рядки на основі їх лексикографічного/алфавітного порядку, і результат буде: 10, 2, 20, apple.
Як уникнути помилки?
Якщо ти знаєш, що твій текстовий стовпець містить числові дані, явно перетвори їх у число перед сортуванням:
SELECT * FROM mixed_data ORDER BY value::INT;
Тепер результат буде: 2, 10, 20.
Але будь обережний: якщо у твоєму стовпці з'являться рядки, які не можна перетворити у числа, запит видасть помилку!
2. Вказування кількох стовпців для сортування
Одна з типових помилок — забути про порядок пріоритетів при сортуванні по кількох стовпцях. Наприклад, якщо ти хочеш відсортувати студентів по прізвищу, а потім по віку, але переплутав порядок:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Твій запит:
-- Неправильне сортування
SELECT *
FROM students
ORDER BY age, last_name;
Результат:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
У цьому випадку PostgreSQL спочатку відсортує студентів по віку, а потім по прізвищу. Не зовсім те, чого ти хотів, правда?
Правильний запит:
SELECT *
FROM students
ORDER BY last_name, age;
Результат:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Тепер сортування спочатку йде по прізвищу, а всередині прізвища — по віку. Саме те, що очікувалось!
3. Сортування з різними напрямками
Іноді треба застосувати одночасне сортування з різними напрямками для стовпців. Наприклад, відсортувати товари по категорії (за зростанням), а в межах кожної категорії — по ціні (за спаданням). Помилка виникає, якщо забути вказати напрямок для другого стовпця:
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
Твій запит:
-- Неправильне сортування
SELECT *
FROM products
ORDER BY category, price;
Результат: ціни всередині категорій відсортовані за зростанням, а ти, можливо, хотів за спаданням.
Правильний запит:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Помилки при форматуванні
4. Неправильне використання CONCAT()
Допустимо, ти хочеш об'єднати ім'я і прізвище в один рядок, але поспіхом забув додати роздільник між ними:
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
Твій запит:
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Результат:
| full_name |
|---|
| JohnDoe |
| JaneSmith |
Як виправити?
Додай пробіл між ім'ям і прізвищем:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Тепер все буде виглядати набагато гарніше:
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Помилки при використанні CAST()
Допустимо, ти намагаєшся перетворити дату у рядок для гарного виводу, але забув вказати формат:
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
Твій запит:
-- Неправильне перетворення
SELECT
CAST(event_date AS TEXT)
FROM events;
Результат: дата буде перетворена у формат YYYY-MM-DD, що не завжди зручно для твоїх користувачів.
Як виправити?
Використовуй функцію TO_CHAR() для вказання формату:
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Тепер дата буде відображатись у форматі 15-01-2023.
6. Помилки при використанні DISTINCT
DISTINCT — потужний інструмент для отримання унікальних значень, але іноді його використовують неправильно. Наприклад, ти хочеш отримати список унікальних імен співробітників:
SELECT DISTINCT first_name, last_name
FROM employees;
На перший погляд, запит виглядає коректно, але якщо у двох співробітників однакові імена і прізвища, вони будуть відображатись як один результат, навіть якщо це різні люди.
Приклад даних:
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Результат запиту:
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
Як уникнути помилки?
Додай первинний ключ, щоб гарантувати унікальність:
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Результат запиту з DISTINCT ON (id):
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Як уникати помилок?
Робота з даними вимагає уважності до деталей. Щоб уникнути описаних вище помилок:
Перевіряй типи даних: переконайся, що використовувані функції підтримують типи даних твоїх стовпців.
Перевіряй порядок сортування: переконайся, що стовпці вказані у правильному порядку. Не забувай про напрямки сортування ASC, DESC.
Тестуй запити на невеликих вибірках даних: це допоможе знайти помилки на ранніх етапах.
Не забувай про документацію PostgreSQL: вона допоможе відповісти на складні питання про функції та їх використання. Ось лінк: оф. документація PostgreSQL.
Тепер ти готовий боротися з будь-якими загадками, пов'язаними з форматуванням і сортуванням! Рухаємось далі.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ