真的可以使用你的幫助!SQL其中customer_id在(xx)
我有一個查詢:
Select *
from Customers
Where Customer_id in (001,002,003)
...你的想法。
我的問題是,如果沒有記錄customer_id 003例如,沒有記錄顯示。 如何顯示「003」並指出沒有找到記錄?我更喜歡這個比沒有記錄顯示。
感謝您提前!
真的可以使用你的幫助!SQL其中customer_id在(xx)
我有一個查詢:
Select *
from Customers
Where Customer_id in (001,002,003)
...你的想法。
我的問題是,如果沒有記錄customer_id 003例如,沒有記錄顯示。 如何顯示「003」並指出沒有找到記錄?我更喜歡這個比沒有記錄顯示。
感謝您提前!
通常這種事情我有一個函數,它需要一個csv併爲我返回一個表。 然後我做了類似以下的事情。
-- this is creating the temporary table which would normally be created by a function.
DECLARE @Temp TABLE (Customer_id int)
INSERT INTO @Temp(Customer_id)
SELECT 1
INSERT INTO @Temp(Customer_id)
SELECT 2
INSERT INTO @Temp(Customer_id)
SELECT 3
-- now do the select statement.
SELECT
T.Customer_id,
C.*
FROM
Customers C
RIGHT OUTER JOIN
@Temp T
ON
T.Customer_id = C.Customer_id
這將然後給你的結果,由此,如果該C.Customer_id
是NULL
那麼它是不存在於您Customer
table
的Id
。 這和@MartinSmith做的一樣,但是被大多數SQL服務器版本支持。
謝謝大家試圖幫助。你們真棒。我不像你們那樣先進,祕密松鼠的解決方案似乎對我來說是最好的。多謝你們。 – user2952152
@ user2952152記得標記哪個答案是解決方案;) 我的答案只是Martin Smiths的一種替代方案,但我想知道如何使這種更通用的方法適合多個數據集,而不僅僅是一次性使用。 –
在oracle中,你可以做這樣的事情:
with vals as
(SELECT '001' as val
from dual
union
select '002'
from dual
union
select '030' from dual)
select v.val, nvl(c.Customer_id, 'no Customer found') from vals v left join Customers c on c.Customer_id = v.val
你需要做的是對你想查找(包括那些可能不存在)的客戶ID列表查詢,然後左邊加入你的customers
表。創建要對查詢客戶ID的臨時表是特定於平臺,但這裏是我會怎麼做,在甲骨文:
with customersToLookup as (
select '001' as customer_id from dual union all
select '002' as customer_id from dual union all
select '003' as customer_id from dual
)
select customersToLookup.customer_id,
customers.*
from customersToLookup
left join customers
on customers.customer_id = customersToLookup.customer_id;
這是非常不尋常的,以我的經驗,運行這樣的查詢: RDBM不意味着以這種方式使用。
感謝您的回覆傢伙。我使用SQL Server 2012管理工作室。 001和1一樣,只是一個例子。 *只是我試圖簡化查詢,我所需要的只是在select中的customer_name。工會將工作,但唉,我需要搜索約50個身份證件(從一個Excel列表)。有沒有比輸入一個選擇語句50個奇數更好的方法?我不介意文本messgae或「null」顯示 – user2952152
在SQL Server 2008+可以使用
SELECT V.Customer_id,
C.*
FROM (VALUES(1),
(2),
(3)) V(Customer_id)
LEFT JOIN Customers C
ON C.Customer_id = V.Customer_id
非匹配值將NULL
在C.Customer_id
列。
正如我在我的回答中的評論中所說的,有沒有一種方法可以將其更改爲「通用」,因此不僅適用於固定值集合? –
@SecretSquirrel - 不是。這個問題顯示了一組固定的值,所以我的答案是基於此。對於通用的一組值,我會使用表值參數而不是分割CSV。 –
從來不知道那些(表值參數),看起來很酷。儘管似乎只被T-SQL支持? –
可能不是最好的解決方案,因爲複雜性,顯然不推薦用於具有很多行的表,但是..我創建了2個新的臨時表:#tempTab2(其中我保存了已發送的ID)和# tempTabFinal(如果ID存在,我保存了與該ID相應的行,如果沒有,則保存「未找到的消息」)。這裏是打印屏幕,看看你是否該做什麼,代碼(我用過用於測試的「問題」表,其中有欄目:q_id和問題 - 實際問題)
DECLARE @INSTR as VARCHAR(MAX)
SET @INSTR = '1,153,154,1555,111,'
DECLARE @SEPERATOR as VARCHAR(1)
DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
SET @SEPERATOR = ','
CREATE TABLE #tempTab2 (id int not null,question varchar(60))
CREATE TABLE #tempTabFinal(id varchar(40) not null,question varchar(60))
WHILE PATINDEX('%' + @SEPERATOR + '%', @INSTR) <> 0
BEGIN
SELECT @SP = PATINDEX('%' + @SEPERATOR + '%',@INSTR)
SELECT @VALUE = LEFT(@INSTR , @SP - 1)
SELECT @INSTR = STUFF(@INSTR, 1, @SP, '')
INSERT INTO #tempTab2 (id,question) VALUES (@VALUE,'question')
END
DECLARE @INDEX INT
SET @INDEX = 1
WHILE (@INDEX <=5)
BEGIN
IF((Select COUNT(*) FROM questions Where q_id= (SELECT TOP 1 id from #tempTab2)) >0 )
BEGIN
DECLARE @TEMP as varchar (80)
SET @TEMP = (Select question from questions where q_id = (SELECT TOP 1 id from #tempTab2))
DECLARE @ID INT
SET @ID = (SELECT TOP 1 id from #tempTab2)
Insert into #tempTabFinal Values(@ID,@Temp)
END
ELSE
BEGIN
DECLARE @NOTFND as Varchar(20)
SET @NOTFND = (SELECT TOP 1 id from #tempTab2)
Insert into #tempTabFinal Values('id ' [email protected] + ' Not found ','Not found')
END
DELETE TOP (1) from #tempTab2
SET @INDEX = @INDEX + 1
END
Select * from #tempTabFinal
DROP TABLE #tempTab2
DROP TABLE #tempTabFinal
您正在使用什麼RDBMS? '001'和'1'一樣。除字符串外,前導零不會做任何事情。 '('001','002','003')' –
我認爲你必須更具體一點。那裏的「*」可能意味着任何事情,你如何聲明沒有找到記錄?短信或「NULL」? 「簡單」的方式來得到你想要的是做一個「選擇*從...聯盟所有選擇customer_id,空,...在哪裏customer_id不在......」。 –