0

ProjectStatusType.Name が null でない場合、次の SQL は期待どおりに機能します。したがって、null 値を「指定なし」に置き換える case ステートメントを入れます。私がやろうとしているのは、ProjectStatusType.Name = 'Not Specified' を表示する where ステートメントを追加することですが、データベースには null projectstatustype.name のレコードがありますが、データは返されません。お知らせ下さい; 別の方法は何ですか、または SQL クエリを修正するにはどうすればよいですか?

SELECT PersonResponsible.Name AS TeamLeaderName,
       CASE
           WHEN ProjectStatusType.Name IS NULL THEN 'Not Specified'
           ELSE COALESCE(ProjectStatusType.Name, '')
       END AS ProjectStatusName,
       Project.ProjectTitle AS Title,
       ProjectStatus.DateStatus,
       Project.ProjectId,
       Project.ContactName,
       BusinessDivision.Name AS BusinessUnit,
       BusinessUnit.Name AS WorkSection,
       ProjectSubGroup.Name AS ProjectSubGroupName,
       ProjectGroup.Name AS ProjectGroupName,
       Project.DateRequested
FROM BusinessUnit
INNER JOIN BusinessDivision ON BusinessUnit.BusinessDivisionId = BusinessDivision.BusinessDivisionId
INNER JOIN ProjectCode ON BusinessUnit.BusinessUnitId = ProjectCode.BusinessUnitId
RIGHT OUTER JOIN Project
INNER JOIN ProjectSubGroup ON Project.ProjectSubGroupId = ProjectSubGroup.ProjectSubGroupId
INNER JOIN ProjectGroup ON ProjectSubGroup.ProjectGroupId = ProjectGroup.ProjectGroupId ON ProjectCode.ProjectCodeId = Project.ProjectCodeId
LEFT OUTER JOIN PersonResponsible ON Project.PersonResponsibleId = PersonResponsible.PersonResponsibleId FULL
OUTER JOIN ProjectStatusType
INNER JOIN ProjectStatus ON ProjectStatusType.ProjectStatusTypeId = ProjectStatus.ProjectStatusTypeId
AND ProjectStatus.ProjectStatusId IN
  (SELECT MAX(ProjectStatusId) AS ProjectStatusId
   FROM ProjectStatus
   GROUP BY ProjectId) ON Project.ProjectId = ProjectStatus.ProjectId
WHERE ProjectStatus ProjectStatusType.Name ='Not Specified'
4

2 に答える 2

0

2 つのポイント:

まず、NULL をチェックする CASE は、COALESCE 式に対して冗長に見えます。

これはもっと簡単なはずです:

SELECT COALESCE(ProjectStatusType.Name, 'Not Specified') AS ProjectStatusName

次に、ProjectStatusType.Name(表の値) と比較することは、(選択した値) と比較することと同じではありませんProjectStatusName

これに近い WHERE 句を試してください。

WHERE ProjectStatusName = 'Not Specified'
于 2013-09-10T00:05:18.627 に答える
0

Itzik Ben-Ganによる、SQL サーバーによるクエリの処理方法に関する優れたグラフを次に示します。この順序は、T-SQL の記述方法とは異なります。

したがって、rutter による解決では、空の文字列を見逃す可能性があります。

このタイプのビジネス ロジックを頻繁に行う場合は、空の文字列または null 値の両方を取り、文字列 'unknown' を返す関数を作成します。クエリでこの関数を呼び出し、「不明」でフィルタリングします。

次の例では、一時テーブルを作成し、テーブルにデータをロードして、空の文字列と null 値の両方を調整名 'Not Specified' に変換して返します。

これが役立つことを願っています。

クエリが思うように機能しない場合は、常に論理処理チャートを参照します。

幸運を

ジョン

-- 
-- Logical query processing
--

-- From, Where, Group By, Having, Select (expression, distince, top), order by

-- sample table
create table #status
( id int identity(1,1),
  name varchar(50) null
);

-- Sample data
insert into #status values
(''),
(null),
('www.craftydba.com');


-- Return rows with null or empty string
select 
    case when ltrim(name) = '' then 'Not Specified'
    else coalesce(name, 'Not Specified') end as adjusted_named, 
    name
from #status 
where 
  ltrim(name) = '' or 
  coalesce(name, 'Not Specified') = 'Not Specified';
于 2013-09-10T00:39:46.517 に答える