[英]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.