C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLの作り方について

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■93769 / inTopicNo.1)  SQLの作り方について
  
□投稿者/ 犬夜叉 (43回)-(2020/01/30(Thu) 09:56:52)

分類:[.NET 全般] 

テーブルにID,NAME列があり、
指定したIDがなければ0
あれば指定したNAMEがあれば1
なければ2を返すようにしたいのですが

最初は CASE 〜 WHEN を使用し用としたのですがうまくいかず、
結局、以下のようにIFを使用するしかなかったのですが
こればベストなのでしょうか?

@ID @NAME 結果
0   'ABC' 0
0   'DEF' 0
1   'ABC' 1
1   'DEF' 2

DECLARE	@ID INT = 1;
DECLARE	@NAME VARCHAR(MAX) = 'ABDC';

WITH
TBL (ID, NAME)
 AS (
 SELECT 1, 'ABC'
 )
SELECT *
INTO  #TBL
FROM  (
    SELECT *
    FROM TBL
    ) AS TBL

IF	(
	SELECT	COUNT(*)
	FROM	#TBL
	WHERE	ID = @ID
	) <= 0
BEGIN
	SELECT	0
END
ELSE
IF	(
	SELECT	COUNT(*)
	FROM	#TBL
	WHERE	ID = @ID
	AND NAME = @NAME
	) > 0
BEGIN
	SELECT	1
END
ELSE
BEGIN
	SELECT	2
END;

IF OBJECT_ID(N'tempdb..#TBL', N'U') IS NOT NULL DROP TABLE #TBL;

引用返信 編集キー/
■93770 / inTopicNo.2)  Re[1]: SQLの作り方について
□投稿者/ WebSurfer (2012回)-(2020/01/30(Thu) 10:02:21)
No93769 (犬夜叉 さん) に返信

SQL Server? Access? SQLite? MySQL? Oracle? その他?

SQL にはサーバーによって方言があるので何かをちゃんと書きましょう。
引用返信 編集キー/
■93772 / inTopicNo.3)  Re[2]: SQLの作り方について
□投稿者/ 犬夜叉 (44回)-(2020/01/30(Thu) 11:09:45)
No93770 (WebSurfer さん) に返信
SQLServerです。
引用返信 編集キー/
■93775 / inTopicNo.4)  Re[1]: SQLの作り方について
□投稿者/ shu (1216回)-(2020/01/30(Thu) 13:42:24)
2020/01/30(Thu) 13:43:58 編集(投稿者)

No93769 (犬夜叉 さん) に返信

試行された方法でよいと思いますが、

> SELECT *
> INTO  #TBL
> FROM  (
>     SELECT *
>     FROM TBL
>     ) AS TBL
>
ここで Where ID = @ID
としてしまった方がより良いと思います。
あと、サブクエリーにする必要はないです。
引用返信 編集キー/
■93777 / inTopicNo.5)  Re[2]: SQLの作り方について
□投稿者/ 犬夜叉 (45回)-(2020/01/30(Thu) 14:36:19)
No93775 (shu さん) に返信
> 2020/01/30(Thu) 13:43:58 編集(投稿者)
ありがとうございました。
ほかにいい方法はないようですね。
最終的に以下のようにします。

DECLARE @ID INT = 1;
DECLARE @NAME VARCHAR(MAX) = 'ABDC';

WITH
TBL (ID, NAME)
 AS (
 SELECT 1, 'ABC'
 )
SELECT *
INTO  #TBL
FROM  (
    SELECT *
    FROM TBL
Where ID = @ID
    ) AS TBL

DECLARE @CT1 INT = (
SELECT COUNT(*) AS CNT
FROM #TBL
)

DECLARE @CT2 INT = (
SELECT COUNT(*) AS CNT
FROM #TBL
WHERE NAME = @NAME
)

SELECT CASE WHEN @CT1 <= 0 THEN 0 WHEN @CT2 > 0 THEN 1 ELSE 2 END

IF OBJECT_ID(N'tempdb..#TBL', N'U') IS NOT NULL DROP TABLE #TBL;

解決済み
引用返信 編集キー/
■93779 / inTopicNo.6)  Re[1]: SQLの作り方について
□投稿者/ 魔界の仮面弁士 (2550回)-(2020/01/30(Thu) 15:23:28)
No93769 (犬夜叉 さん) に返信
> テーブルにID,NAME列があり、
> 指定したIDがなければ0
> あれば指定したNAMEがあれば1
> なければ2を返すようにしたいのですが

#tbl の生成と破棄の部分はざっくり無視して、
上記の判定だけ行えれば良いのなら、これでどうでしょう。


DECLARE @結果 INT;

SET @結果 = ISNULL(
  (SELECT TOP 1
   CASE NAME WHEN @NAME THEN 1 ELSE 2 END
   FROM #tbl
   WHERE ID = @ID
  ), 0);

SELECT @結果 ;

引用返信 編集キー/
■93780 / inTopicNo.7)  Re[2]: SQLの作り方について
□投稿者/ 犬夜叉 (46回)-(2020/01/30(Thu) 15:37:35)
No93779 (魔界の仮面弁士 さん) に返信

ありがとうございます。
ずいぶんコンパクトになりました。

DECLARE @ID INT = 2;
DECLARE @NAME VARCHAR(MAX) = 'DEF';

WITH
TBL (ID, NAME)
AS (
SELECT 1, 'ABC'
UNION SELECT 2, 'DEF'
)
SELECT *
INTO  #TBL
FROM  (
    SELECT *
    FROM TBL
Where ID = @ID
    ) AS TBL

SELECT ISNULL(
(
SELECT TOP 1
CASE NAME WHEN @NAME THEN 1 ELSE 2 END
FROM #tbl
WHERE ID = @ID
), 0);

IF OBJECT_ID(N'tempdb..#TBL', N'U') IS NOT NULL DROP TABLE #TBL;

解決済み
引用返信 編集キー/
■93781 / inTopicNo.8)  Re[3]: SQLの作り方について
□投稿者/ shu (1217回)-(2020/01/30(Thu) 16:14:50)
No93780 (犬夜叉 さん) に返信

Select Isnull(nm , 0) result
From (
Select MIN(CASE Name WHEN @Name THEN 1 ELSE 2 END) nm
From TBL
Where ID = @ID
) tb2

これでできるかも。(魔界の仮面弁士 さんの内容を参考にしました。)

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ