本当にあなたの助けを借りることができました!
質問があります:
Select *
from Customers
Where Customer_id in (001,002,003)
…お分かりですね。
私の問題は、たとえば customer_id 003 のレコードがない場合、レコードが表示されないことです。「003」と表示して、レコードが見つからないことを示すにはどうすればよいですか? レコード表示がまったくないよりは、これの方がいいと思います。
よろしくお願いします!
本当にあなたの助けを借りることができました!
質問があります:
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
ます。これは @MartinSmith と同じ仕事をしますが、ほとんどの SQL サーバー バージョンでサポートされています。Id
Customer
table
複雑なため、おそらく最善の解決策ではなく、行数の多いテーブルには明らかにお勧めできませんが.. 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
オラクルでは、次のようなことができます。
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 の一時テーブルの作成はプラットフォーム固有ですが、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 は、このような方法で使用されることを意図していません。