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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

5回答

818閲覧

sqlのcaseについて

kassy

総合スコア12

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

0グッド

0クリップ

投稿2019/02/08 01:10

編集2019/02/08 01:22

SQLiteのCASE文で一気に条件分岐したいです

例えば、

idnum
110
220
330

というデータがあった際に、idが1の時は数字を日本語読みで表示したいとします。
現在はCASEを複数用いて、

sql

1select 2 case when id = 1 3 then 'いち' 4 else id 5 end as id, 6 case when id = 1 7 then 'じゅう' 8 else num 9 end as num 10from table

みたいに書いているのですが、同じcase文を書くのが煩わしいです。
そこで次のようにcaseをまとめたいです。

以下疑似コードです

理想

sql

1select 2 case when num = 1 3 then 'いち' as id, 'じゅう' as num 4 else id, num 5 end 6from table

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

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

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

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

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

m.ts10806

2019/02/08 01:12

どいう想定データでどういう結果を望むか具体的に書かれた方が良いと思います。 擬似は擬似としてもこれだけで伝わることはほんの僅かです(私にはあまり理解できませんでした)
Orlofsky

2019/02/08 01:21

わたしも a, b, c, d や e, f, g, h が何をやりたいのかわかりません。 何をやりたいのかきちんと説明が欲しいですし、SQLは実行できるだけの内容を提示するのが質問者としてのマナーです。
guest

回答5

0

case文の出力を複数のカラムで出力する事はできません。
テーブルやレコードの型で返却可能なストアドに対応しているDBMSもありますが、SQLiteはそもそもストアドに対応していないので、変換(id,カラム名)のようなものも作成できません。

case文を使用しないなら変換用のテーブルを介す事ですが、項目数文の記述になるので楽にはなりませんね。

投稿2019/02/08 01:52

sazi

総合スコア25174

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

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

0

ベストアンサー

クエリをふたつ作って結合すればいいような気がします。

SQL

1select 'いち' as id, 'じゅう' as num from table where num=1 2union 3select id, num from table where num!=1

投稿2019/02/08 01:48

ttyp03

総合スコア16998

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

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

sazi

2019/02/08 02:54

簡潔さに+。 ただコストは掛かってしまうので、そもそもの設計に不備がある事は質問者さんには認識してもらいたいところ。
Orlofsky

2019/02/08 03:06

UNION じゃなくて、 UNION ALL でしょう。マニュアルを確認してね。
ttyp03

2019/02/08 04:10

Orlofskyさん> UNIONってないんですか?UNION ALLのみ? いや、そんなことないですよね? マニュアルには載ってますし。 https://www.sqlite.org/lang_select.html どっち使ったとしても二つのクエリの結果が重複することはないでしょうから、結果は変わらないと思いますけど。
sazi

2019/02/08 04:25

UNIONだとマージされて件数が少なくなるケースがあります。 マージするのは要件ではないでしょうから、union allの方が適切です。 また、union allの方がマージしない分高速です。
ttyp03

2019/02/08 04:27

そうなんですね。 じゃあALLで。
Orlofsky

2019/02/08 04:38

sazi さんのコメントがありましたね。ありがとうございます。
guest

0

日本語読み用のテーブルを用意しては?

投稿2019/02/08 01:29

kasa0

総合スコア578

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

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

m.ts10806

2019/02/08 01:31 編集

賛成です。 毎回SQLで変換をかけるのはコストが大きすぎます。表示調整のためなら利用するプログラムで対応した方が良い場面も多いですしね。
kassy

2019/02/08 01:34

日本語読みに変換するのはあくまで一例で、CASEをひとまとめにしたいのがメインの問題です。 わかりにくくてすいません
guest

0

SQLiteってことは何かのアプリで読み出してるんじゃないかと思って全然違うことを書きます。

SQLを作るプライベートなヘルパをかけばいいと思います。

投稿2019/02/08 01:59

papinianus

総合スコア12705

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

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

0

1回の case で済ませたいということであれば、「1列として取得する」くらいしか思いつきませんでした。

sql

1select 2 case when id = 1 3 then 'いち,じゅう' 4 else id||','||num 5 end as idnum 6from table;

動作サンプル

これで得た結果をさらにカンマで区切って2列に戻す、ということもできはするでしょうが、かえって冗長ですね……。

ttyp03 さんの案に1票です。

投稿2019/02/08 02:04

編集2019/02/08 02:06
alg

総合スコア2019

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問