回答:
SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value]
FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND
(S.WebUserId = @WebUserId OR S.AllowUploads = 1)
これはAdam Robinsonのものに似ていますが、COUNTではなくISNULLを使用します。
SELECT ISNULL(
(SELECT 1 FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND
(S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0)
内部クエリに一致する行がある場合、1が返されます。外部クエリ(ISNULLを使用)は、この値1を返します。内部クエリに一致する行がない場合、何も返しません。外部クエリはこれをNULLのように扱うため、ISNULLは最終的に0を返します。
これは死んだ馬かもしれません。行が存在しないときに1行を返す別の方法は、別のクエリをUNIONして、テーブルに存在しないときに結果を表示することです。
SELECT S.Status, COUNT(s.id) AS StatusCount
FROM Sites S
WHERE S.Id = @SiteId
GROUP BY s.Status
UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS
SELECT 'N/A' AS Status, 0 AS StatusCount
WHERE NOT EXISTS (SELECT 1
FROM Sites S
WHERE S.Id = @SiteId
)
SELECT 0
)を返すクエリでユニオンを実行し、次にユニオンでaを実行しSUM
ました。シンプルでわかりやすい。
何かのようなもの:
if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1))
select 1
else
select 0
select 1
とselect 2
私が追加した後as <colName>
私はここですべての答えを読み、何が起こっているのかを理解するのにしばらく時間がかかりました。以下は、答えに基づいています Moe Siskoのといくつかの関連研究に
SQLクエリがデータを返さない場合は、null値のフィールドがないため、ISNULLもCOALESCEも期待どおりに機能しません。サブクエリを使用すると、トップレベルのクエリはnull値のフィールドを取得し、ISNULLとCOALESCEの両方が期待どおりに機能します。
私の質問
select isnull(
(select ASSIGNMENTM1.NAME
from dbo.ASSIGNMENTM1
where ASSIGNMENTM1.NAME = ?)
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'
コメント付きのクエリ
select isnull(
--sub query either returns a value or returns nothing (no value)
(select ASSIGNMENTM1.NAME
from dbo.ASSIGNMENTM1
where ASSIGNMENTM1.NAME = ?)
--If there is a value it is displayed
--If no value, it is perceived as a field with a null value,
--so the isnull function can give the desired results
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'
WHEREをLEFT JOINに置き換えるだけです。
SELECT CASE
WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1
ELSE 0
END AS [Value]
FROM (SELECT @SiteId AS Id) R
LEFT JOIN Sites S ON S.Id = R.Id
このソリューションでは、各列のデフォルト値を返すこともできます。次に例を示します。
SELECT
CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1,
S.Col2,
ISNULL(S.Col3, 0) AS Col3
FROM
(SELECT @Id AS Id) R
LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ...
これは一方通行かもしれません。
SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
WHERE [conditions]
UNION ALL
SELECT 0 )A ORDER BY [Column Name] DESC
@ hai-phanの答えLEFT JOIN
が鍵となりますが、理解するのが少し難しいかもしれません。何も返さない可能性のある複雑なクエリがありました。私は私のニーズに対する彼の答えを単純化しました。多くの列を持つクエリに適用するのは簡単です。
;WITH CTE AS (
-- SELECT S.Id, ...
-- FROM Sites S WHERE Id = @SiteId
-- EXCEPT SOME CONDITION.
-- Whatever your query is
)
SELECT CTE.* -- If you want something else instead of NULL, use COALESCE.
FROM (SELECT @SiteId AS ID) R
LEFT JOIN CTE ON CTE.Id = R.ID
更新:SqlServerCentralに関するこの回答が最適です。MAXのこの機能を利用します- 「選択する行がない場合、MAXはNULLを返します。」
SELECT ISNULL(MAX(value), 0) FROM table WHERE Id = @SiteId
You should avoid using expensive methods. You dont need any column for TBL2.
SELECT COUNT(*) FROM(
SELECT TOP 1 1 AS CNT FROM TBL1
WHERE ColumnValue ='FooDoo' ) AS TBL2
or
IF EXISTS (SELECT TOP 1 1 FROM TABLE1 AS T1
WHERE T1.ColumnValue='VooDoo')
SELECT 1
ELSE
SELECT 0