簡體   English   中英

某些結果可能為空的 T-SQL 語句

[英]T-SQL statement with possible nulls on some results

我有2個表如下:

項目

pid   pname   pdesc
-----------------------
 1    pr1     desc for pr1
 2    pr2     desc for pr2

工作項目

wid  pid*   wname   wdesc
---------------------------------
 1    2     wr1     desc for wr1
 2    2     wr2     desc for wr2

pid是外鍵

我想編寫一個 SQL 語句,它在這兩個表中搜索特定字符串。 該語句應涵蓋以下在 BOTH 表中搜索 BOTH name 和 desc 的場景:

如果用戶搜索"wr1" ,則結果應返回以下內容:

wid: 1, pid: 2, wdesc: "desc for wr1",  pname: "pr2",  pdesc: "desc for pr2"

如果用戶搜索"pr1" ,那么結果應該是:

wid: null, pid: 1, wdesc: null,  pname: "pr1",  pdesc: "desc for pr1"

如果用戶搜索"desc" ,那么結果應該是:

wid: null, pid: 1, wdesc: null,  pname: "pr1",  pdesc: "desc for pr1"
wid: null, pid: 2, wdesc: null,  pname: "pr2",  pdesc: "desc for pr2"
wid: 1, pid: 2, wdesc: "desc for wr1",  pname: "pr2",  pdesc: "desc for pr2"
wid: 2, pid: 2, wdesc: "desc for wr2",  pname: "pr2",  pdesc: "desc for pr2"

我在想是否需要執行兩個單獨的 SELECT 語句,然后加入它們並按 pid 對結果進行分組。 但想知道是否有更有效的方法..

模式和插入語句:

 create table Project(pid int, pname varchar(50),   pdesc varchar(50))
 insert into Project values(1,    'pr1','desc for pr1');
 insert into Project values(2,    'pr2','desc for pr2');
 
 create table Workitem(wid int,  pid int,   wname   varchar(50), wdesc varchar(50));
 insert into Workitem values(1,    2,     'wr1'     ,'desc for wr1');
 insert into Workitem values(2,    2,     'wr2'     ,'desc for wr2');

詢問:

 select concat('wid: ',w.wid, ' , pid: ',p.pid, ' , wdesc:',  w.wdesc,
 ' , pname: ',p.pname ,' , pdesc: ',p.pdesc) Output
 from 
 project p left join  workitem w on p.pid=w.pid
 where pdesc like '%desc%' or wdesc like '%desc%';
Output
wid: , pid: 1, wdesc: , pname: pr1, pdesc: desc for pr1
wid: 1, pid: 2, wdesc:desc for wr1, pname: pr2, pdesc: desc for pr2
wid: 2, pid: 2, wdesc:desc for wr2, pname: pr2, pdesc: desc for pr2

db<小提琴在這里

正如您所期望的結果,您所擁有的看起來像是格式錯誤的 JSON。 我將假設所有值至少應該用逗號分隔。 然后您可以使用 SQL 服務器內置的FOR JSON功能來實現此目的:

CREATE TABLE dbo.Project (pid int, pname char(3), pdesc varchar(15));
INSERT INTO dbo.Project
VALUES(1,'pr1','desc for pr1'),
      (2,'pr2','desc for pr2');
GO

CREATE TABLE dbo.WorkItem (wid int, pid int, wname char(3), wdesc varchar(15));
INSERT INTO dbo.WorkItem
VALUES(1,2,'wr1','desc for wr1'),
      (2,2,'wr2','desc for wr2');

GO

DECLARE @YourParam varchar(15) = 'pr1';

SELECT REPLACE(STUFF((SELECT WI.wid,P.pid,WI.wdesc,P.pname,P.pdesc
                      FOR JSON PATH, INCLUDE_NULL_VALUES),1,2,''),'}]','')
FROM dbo.Project P
     LEFT JOIN dbo.WorkItem WI ON P.pid = WI.pid
WHERE P.pdesc LIKE '%' + @YourParam + '%'
   OR WI.wdesc LIKE '%' + @YourParam + '%'; --Add the Name columns as needed.

GO

DROP TABLE dbo.Project
DROP TABLE dbo.WorkItem;

編輯:根據評論,也許這就是你真正想要的:

DECLARE @YourParam varchar(15) = 'desc';

SELECT REPLACE(STUFF((SELECT NULL AS wid,P.pid, NULL AS wdesc,P.pname,P.pdesc
                      FOR JSON PATH, INCLUDE_NULL_VALUES),1,2,''),'}]','')
FROM dbo.Project P
WHERE P.pdesc LIKE '%' + @YourParam + '%'
   OR P.pname LIKE '%' + @YourParam + '%'
UNION ALL
SELECT REPLACE(STUFF((SELECT WI.wid,P.pid,WI.wdesc,P.pname,P.pdesc
                      FOR JSON PATH, INCLUDE_NULL_VALUES),1,2,''),'}]','')
FROM dbo.Project P
     JOIN dbo.WorkItem WI ON P.pid = WI.pid
WHERE P.pdesc LIKE '%' + @YourParam + '%'
   OR WI.wdesc LIKE '%' + @YourParam + '%'
   OR P.pname LIKE '%' + @YourParam + '%'
   OR WI.wname LIKE '%' + @YourParam + '%';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM