CodeGym /コース /SQL SELF /データのソートとフォーマットでありがちなミス

データのソートとフォーマットでありがちなミス

SQL SELF
レベル 6 , レッスン 4
使用可能

ソートやフォーマットって、やるとデータが見やすくなるし便利だよね。でも、うっかりミスしちゃうと、思わぬ結果になったりする。よくあるミスを一緒に見て、データをいつもキレイ&正しい順番で出せるようにしよう!

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

どうやってミスを防ぐ?

データを扱う時は細かいところまで気をつけよう。上で紹介したミスを防ぐには:

データ型をチェックしよう:使う関数がカラムの型に合ってるか確認しよう。

ソート順をチェックしよう:カラムの順番が正しいか、ASCDESCの指定を忘れてないか確認しよう。

小さいデータでクエリをテストしよう:早めにミスに気づけるよ。

PostgreSQLのドキュメントも忘れずに:関数や使い方で困ったら、ここを見れば大体解決!リンクはこちら:公式ドキュメント PostgreSQL

これでフォーマットやソートの謎にも負けない!どんどん進もう!

1
アンケート/クイズ
ユニークな値の抽出、レベル 6、レッスン 4
使用不可
ユニークな値の抽出
ユニークな値の抽出
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION