質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

7回答

711閲覧

SQL文(A) or (B)どちらを使うべきでしょうか?

kimura-i

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/03/04 14:54

編集2020/03/04 15:09

前提・実現したいこと

プログラム(※例 JAVA,PHPなど)で使用するSQL文として、
下記(A)(B)どちらのSQL文を使用する方が望ましいのか、理由・ご意見を頂けたら幸いです。

<MySQL> (A) SELECT IFNULL(name, 'UNKNOWN') FROM user; (B) SELECT CASE WHEN name IS NULL THEN 'UNKNOWN' ELSE name END FROM user;

(A)
<メリット>
・SQL文が見やすい

<デメリット>
・DBが変更になった際に、修正が必要

(B)
<メリット>
・DBが変更になった際に、修正が不要

<デメリット>
・SQL文が(A)より見にくい。

前提

・DB変更する予定はない
・複雑なSQL文の場合、IFNULL関数を使用しても良い

発生している問題

単純なSQL文の場合、標準SQL文で書いた方が良いか?
レビューを受けた際に、どちらが良いか激論になった。

その他

・上記「単純なSQL文の場合」といった条件があると、一貫性がなくなる。+線引きが必要になる。

疑問

・開発現場毎に、合わせるべきだろう?
・そもそもどちらでも良い?混在していても良い?
・意識として標準SQL文で書く事を心掛けるべきだろうが、今回の場合どっち?う~んとなる。

補足情報

仮にDB変更になった場合、現状主要DBに関しては置換で一発変換できる。

<Oracle> SELECT NVL(name, 'UNKNOWN') FROM user; <PostgreSQL> SELECT COALESCE(name, 'UNKNOWN') FROM user; <SQL Server> SELECT ISNULL(name, 'UNKNOWN') FROM user;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

(C) SELECT coalesce(name, 'UNKNOWN') FROM user

(A)と(B)を兼ね備えています。

どちらが良いかなんて、目的が決まれば自ずと決まります。

投稿2020/03/04 16:15

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura-i

2020/03/04 16:56 編集

なるほど~といった感じです。 SQL総合1位の方からのご意見、とても勉強になりました。 貴重なご意見ありがとうございます。 teratailに質問してよかったです(^^)♪ ちなみに、現情報で(A) or (B)2択だとどちらがお勧めなんでしょうか。 目に留まったらお聞きしたいです(´・ω・`) 要するに今回はcoalesceという抜け道?をお聞きする事ができましたが、IFNULLを一例と考えて頂いた場合。著しくSQL文がみにくくならないのであればDB変更に備えたSQL文を心掛けるべきか、わかりやすさ重視で行くべきかが今回の議題でもありまして。。。 欲しがりな僕、ごめんなさい。
sazi

2020/03/04 18:56

制約なしに、個人的に(A)か(B)のどちらか選べと言われるなら(A)です。 理由は記述の簡潔さです。
kimura-i

2020/03/05 00:24

ご回答いただき、誠にありがとうございます。 同じ考えで少し自身が付きます(*´ω`*)
sazi

2020/03/05 06:09 編集

> coalesceという抜け道 coalesce()は標準です。 IFNULL()と違い、引数は幾つでも指定できますので、coalesce()の方が強力です。
kimura-i

2020/03/05 14:26

標準でした。すみませんありがとうございます。
guest

0

(A)でよいと思います。

DBが変更になった場合、確かに(B)であればこのSQLについては修正が不要かもしれません。しかし、だからと言って動作確認の作業が不要になるわけではありませんし、DB種類に依存しないSQLのみを利用してシステムを作成するのは現実的には難しいです。
であれば「DBが変更になった際に、修正が不要」というのはメリットとしてほぼ無意味でしょう。また「複雑なSQL文の場合、IFNULL関数を使用しても良い」という前提があるのであれば、一貫性の観点からもIFNULL関数に統一すべきだと思います。

投稿2020/03/04 15:42

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura-i

2020/03/04 16:16 編集

>だからと言って動作確認の作業が不要になるわけではありません >、DB種類に依存しないSQLのみを利用してシステムを作成するのは現実的には難しい 貴重なご意見ありがとうございます。おっしゃる通りだと思います。 DB変更の際に、完全には難しいですが修正箇所をなるべく減らせるからという理由です。
kimura-i

2020/03/05 14:31

今回の主題に一番沿ったご意見を下さいました。 本当にありがとうございます('ω')ノ
guest

0

SQL

1select coalesce(name,'UNKONWN') as name,case when name is null then 1 else 0 end as name_is_null from tbl; 2

投稿2020/03/05 01:51

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/03/05 01:53

nameの中にすでに"UNKOWN"と入力されている場合を考慮すると A,Bどちらかではなく、両方併用する必要がある場合もあります
kimura-i

2020/03/05 14:12

貴重なご意見ありがとうございます。 すでに"UNKOWN"が入力されているかの考慮、忘れないよう心掛けたいと思います。
guest

0

みなさま貴重なご意見ありがとうございました。
(A) or (B)であれば、やはり(A)で良いんだと再認識する事ができました。

また、今後はnullチェックにcoalesceを使う事も検討して行きたいなと思いました。
今回の場合、coalesceが最適ですが、現場によりIFNULLの方がわかりやすいなど出てくるのかな~と思いました。

投稿2020/03/05 14:18

kimura-i

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

余計ですがnameのNULL、空文字、スペース、全角の時も考えてみました。NULL保障されていれば不要です。

sql

1select if(trim(both from replace(name,' ',' '))>'',name,'UNKNOWN') from test;

投稿2020/03/05 05:45

編集2020/03/05 05:47
amura

総合スコア333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura-i

2020/03/05 14:12

ありがとうございます。
guest

0

(A)が良いと思います。
簡潔で見易い事は、後任に対しても大事な事で、解析し難いPGは後任へ混乱を
招きシステムの不具合を招きかねません。

DB変わった場合のデメリットですが、仮に変わったとしましょう。
現場ではどう対応しますか?
DB変わったけど、動作するから問題なし!でリリースします?
しませんよね、普通は全体的に問題ないか等の調査は確実に行います。
なのでデメリットという感じではなくなると思います。

いままで沢山のSQLを見てきましが、やはり後任には見易さが大事です。
複雑や、やたら長いSQL書くと読み辛いので、解読に時間を要します。
むしろココがデメリットと捉える箇所かと思っております。

投稿2020/03/04 23:23

NEO_PLANETT-777

総合スコア333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura-i

2020/03/05 00:35 編集

貴重なご意見ありがとうございます。 >DB変わった場合のデメリットですが、仮に変わったとしましょう。 >現場ではどう対応しますか? 私自身3回ほどDB変更対応した経験がありますが、 どの現場でもすべてのSQLを見直し、必要な個所を修正していきます。 なるべく見やすく同じ記述をしていると、修正が楽だった覚えがあります。 >やはり後任には見易さが大事です。 >やたら長いSQL書くと読み辛いので、解読に時間を要します。 やはりDB変更する際の事考えても、見やすさを重視するべきですね。
guest

0

私の場合、実務でSQL文を書くことも全くありませんし、そうそう個人開発でも使わないことをご承知おきください。あと完全に主観です。

ここは完全に好みなのですが

(A) SELECT IFNULL(name, 'UNKNOWN') FROM user;

のほうが、ぱっと見の観点と、ある程度見慣れたSQL文であるという観点から推します。

しかしながら、質問者さんがおっしゃっているようにこれらの記法は現場毎で決めておいた方がよいと思います。後々の理解の相違につながらずに済みます。(類似の経験あり)
あと、混在すべきではないということも個人的には強調してきたいです。混在するとちょうどデメリットしか残りません。

もし、これをある程度公正な立場で判断するとしたら、そのプロジェクトが将来的にDB設計を変更する可能性があるのか、どの頻度でそれらのSQL文を使っていくのか、どれくらいの技量を持った人がどれくらい集まって制作していくのかを加味した方が良いとは思います。

投稿2020/03/04 15:22

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura-i

2020/03/04 15:48

貴重なご意見ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問