ソートやフォーマットって、やるとデータが見やすくなるし便利だよね。でも、うっかりミスしちゃうと、思わぬ結果になったりする。よくあるミスを一緒に見て、データをいつもキレイ&正しい順番で出せるようにしよう!
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. 複数カラムでソートする時の順番ミス
よくあるのが、複数カラムでソートする時に優先順位を間違えること。例えば、学生をlast_nameで、その中でageでソートしたいのに、順番を逆にしちゃうとか:
| 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はまずageでソートして、その中でlast_nameでソートする。思ってたのと違うよね?
正しいクエリ:
SELECT *
FROM students
ORDER BY last_name, age;
結果:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
これで、まずlast_nameで、その中でageでソートされる。これが期待通り!
3. ソート方向の指定ミス
たまに、カラムごとにソート方向を変えたい時があるよね。例えば、categoryで昇順、その中でpriceを降順にしたいとか。2つ目のカラムの方向を指定し忘れるとミスになる:
| 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;
結果:categoryごとにpriceが昇順でソートされちゃう。降順にしたかったのに!
正しいクエリ:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
フォーマット時のミス
4. CONCAT()の使い方ミス
例えば、first_nameとlast_nameを1つの文字列にしたい時、うっかり区切り文字を入れ忘れることがある:
| 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 |
どう直す?
first_nameとlast_nameの間にスペースを入れよう:
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;
一見正しそうだけど、もし同じ名前・苗字の人が2人いたら、1つの結果としてまとめられちゃう。実は別人なのに!
データ例:
| 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。
これでフォーマットやソートの謎にも負けない!どんどん進もう!
GO TO FULL VERSION