🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL Server

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

SQL

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

Q&A

解決済

2回答

985閲覧

sql serverの条件分岐について

niconicodryyy

総合スコア36

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2019/10/01 07:09

sql serverの条件分岐について教えてください。
前提条件としてデータベースにSTATEと言うテーブル
IDと言う属性があるとします。IDには数字の0か1しかありません。
自動更新しない設定です

データベースですから一度に多数の方が接続するかと思います。
1の時に0に変更、0の時に1に変更すると言ったSQL文はわかるのですが、
AさんBさんが同時にデータベース接続した際
Aさんが数字を1に変更しても自動更新しないのでBさんには0の表示のままです。
そこでBさんがこの時に1に変更した(実際の数字は1)際1に変更しましたと返したいです。

SQL文を分けて作るのではなく一つのSQL文ですっきりとさせたく以下のSQL文を考えましたがこのままでは1の時に0、0の時に1にする
ただ入れ替えるだけのSQLになってしまいます。

SQL

1UPDATE STATE 2SET ID = 3CASE 4 WHEN ID = 1 THEN ID = 0 5 ELSE ID = 0 THEN ID = 1;

1に入れ替える→IDが1の時1を返し0の時1を返す。
0に入れ替える→IDが0の時0を返し1の時0を返す。

と言ったSQL文を作りたいのですが上記のSQL文に何を加えれば私の要望どおり上手くいくのでしょうか。
ご教授をお願い致します。

SQLの問題集を解いていてふと疑問に思っただけの質問ですから特に使用しているSQL Serverのバージョン
などはありません。
SQL Serverがいいですが、元々はoracle のSQL文から学習を始めてましたのでSQL Severでは
使えないけどこんなやmysqlではこんなのがあるよと言った他のデータベースの事も教えて頂けるとありがたいです。
上記ではcase文で作成していますがcase文にこだわりがあり訳ではなくif文などで教えて頂いても結構です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

データベースだけではソフトやアプリにはならないので
データベースのデータを利用するなにかがあると思います。

アプリ側からAさんやBさんが「現在見えている値」を渡して
条件分岐、判断、値の返却をする方がいいのでは?

1に入れ替える→IDが1の時1を返し0の時1を返す。
0に入れ替える→IDが0の時0を返し1の時0を返す。

↑これでは入れ替えようとしている値を取得しているだけで
あまり意味がないように思うのですが、、、

sazi氏の仰るOUTPUT句で色々やれると思います。

SQL

1CREATE PROCEDURE usp_v値更新 2 @見えていた値 int 3AS 4BEGIN 5 SET NOCOUNT ON; 6 7 update A 8 set ID=case when @見えていた値=1 then 0 else 1 end 9 output @見えていた値 as 見えていた値 10 ,case when @見えていた値=1 then 0 else 1 end as 更新したい値 11 ,deleted.ID as 更新前ID 12 ,case when deleted.ID=@見えていた値 then '更新されたよ' 13 else 'もともと[' + cast(deleted.ID as varchar(1)) + ']でした' end as 結果 14 from [dbo].[STATE] as A 15 16 17END 18GO

実行

SQL

1usp_v値更新 1

こんな感じで書けば自分に見えていた値と最初から違っていたのかとか
わかるんじゃないかと思います。勝手に妄想したので違ってたらすみません。

関係ありませんが「IDという列を0-1値で切り替える」というのは違和感が凄まじいです、、、

投稿2019/10/01 09:38

sousuke

総合スコア3830

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

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

niconicodryyy

2019/10/02 03:36

sousuke様、ご回答ありがとうございます。 1に入れ替える→IDが1の時1を返し0の時1を返す。 0に入れ替える→IDが0の時0を返し1の時0を返す。 ↑これでは入れ替えようとしている値を取得しているだけで あまり意味がないように思うのですが、、 上記は同じ状態の要求がされることがあるその場合、処理を行わず結果だけを返したいと言うのを上手く例えられず上記の様な言い方になりました。
guest

0

updateして結果も返却ということならoutputを使用することになります。
OUTPUT 句 の紹介

具体的に楽観的排他では似たような事は行いますね。

投稿2019/10/01 07:52

sazi

総合スコア25327

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

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

niconicodryyy

2019/10/02 03:37

sazi様。ありがとうございます。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問