2013-11-04 14 views
0

真的可以使用你的幫助!SQL其中customer_id在(xx)

我有一個查詢:

Select * 
from Customers 
Where Customer_id in (001,002,003) 

...你的想法。

我的問題是,如果沒有記錄customer_id 003例如,沒有記錄顯示。 如何顯示「003」並指出沒有找到記錄?我更喜歡這個比沒有記錄顯示。

感謝您提前!

+2

您正在使用什麼RDBMS? '001'和'1'一樣。除字符串外,前導零不會做任何事情。 '('001','002','003')' –

+0

我認爲你必須更具體一點。那裏的「*」可能意味着任何事情,你如何聲明沒有找到記錄?短信或「NULL」? 「簡單」的方式來得到你想要的是做一個「選擇*從...聯盟所有選擇customer_id,空,...在哪裏customer_id不在......」。 –

回答

1

通常這種事情我有一個函數,它需要一個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_idNULL那麼它是不存在於您CustomertableId。 這和@MartinSmith做的一樣,但是被大多數SQL服務器版本支持。

+0

謝謝大家試圖幫助。你們真棒。我不像你們那樣先進,祕密松鼠的解決方案似乎對我來說是最好的。多謝你們。 – user2952152

+0

@ user2952152記得標記哪個答案是解決方案;) 我的答案只是Martin Smiths的一種替代方案,但我想知道如何使這種更通用的方法適合多個數據集,而不僅僅是一次性使用。 –

0

在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 
0

你需要做的是對你想查找(包括那些可能不存在)的客戶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不意味着以這種方式使用。

+0

感謝您的回覆傢伙。我使用SQL Server 2012管理工作室。 001和1一樣,只是一個例子。 *只是我試圖簡化查詢,我所需要的只是在select中的customer_name。工會將工作,但唉,我需要搜索約50個身份證件(從一個Excel列表)。有沒有比輸入一個選擇語句50個奇數更好的方法?我不介意文本messgae或「null」顯示 – user2952152

1

在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 

非匹配值將NULLC.Customer_id列。

+0

正如我在我的回答中的評論中所說的,有沒有一種方法可以將其更改爲「通用」,因此不僅適用於固定值集合? –

+1

@SecretSquirrel - 不是。這個問題顯示了一組固定的值,所以我的答案是基於此。對於通用的一組值,我會使用表值參數而不是分割CSV。 –

+0

從來不知道那些(表值參數),看起來很酷。儘管似乎只被T-SQL支持? –

0

可能不是最好的解決方案,因爲複雜性,顯然不推薦用於具有很多行的表,但是..我創建了2個新的臨時表:#tempTab2(其中我保存了已發送的ID)和# tempTabFinal(如果ID存在,我保存了與該ID相應的行,如果沒有,則保存「未找到的消息」)。這裏是打印屏幕,看看你是否該做什麼,代碼(我用過用於測試的「問題」表,其中有欄目:q_id和問題 - 實際問題) enter image description here

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 
相關問題