0

本当にあなたの助けを借りることができました!

質問があります:

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

…お分かりですね。

私の問題は、たとえば customer_id 003 のレコードがない場合、レコードが表示されないことです。「003」と表示して、レコードが見つからないことを示すにはどうすればよいですか? レコード表示がまったくないよりは、これの方がいいと思います。

よろしくお願いします!

4

5 に答える 5

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_idが得られNULLます。これは @MartinSmith と同じ仕事をしますが、ほとんどの SQL サーバー バージョンでサポートされています。IdCustomer table

于 2013-11-04T12:23:02.093 に答える
0

複雑なため、おそらく最善の解決策ではなく、行数の多いテーブルには明らかにお勧めできませんが.. 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 ' +@NOTFND + ' Not found ','Not found')
    END

    DELETE TOP (1) from #tempTab2
    SET @INDEX = @INDEX + 1
END

Select * from #tempTabFinal
DROP TABLE #tempTab2
DROP TABLE #tempTabFinal
于 2013-11-04T14:45:22.277 に答える
0

オラクルでは、次のようなことができます。

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
于 2013-11-04T10:43:02.913 に答える
0

あなたがする必要があるのは、検索したい顧客IDのリスト(存在しない可能性があるものを含む)に対してクエリを実行し、これをcustomersテーブルに結合したままにすることです。照会する顧客 ID の一時テーブルの作成はプラットフォーム固有ですが、Oracle で行う方法は次のとおりです。

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 は、このような方法で使用されることを意図していません。

于 2013-11-04T10:47:47.857 に答える