注意:這是我正在嘗試做的一個過度簡化的版本。
假設我有一個名為 USERS 的表,其中包含 FIRSTNAME、LASTNAME。內容是:
JOHN SMITH
DAVID BECKHAM
ELON MUSK
我想查詢這個表,如果一個值存在,它只回傳那個值,否則它回傳整個表。例子:
SELECT *
FROM USERS
WHERE FIRSTNAME = 'JOHN'
這將回傳
JOHN SMITH
但是,如果查詢是
SELECT *
FROM USERS
WHERE FIRSTNAME = 'JANE'
那么回報將是
JOHN SMITH
DAVID BECKHAM
ELON MUSK
這是在 SQL Server 中完成的,但 Oracle 也有潛力,以防萬一。
uj5u.com熱心網友回復:
如果您的 RDBMS 支持,這是一個可能在 Oracle 或 SQL 服務器中作業的示例CTE
我們可以嘗試使用UNION ALL并NOT EXISTS制作它。
如果第一個結果存在值,則過濾,這意味著您過濾 a那么FIRSTNAME您只會獲得記錄(因為不會讓第二個結果集起作用)。CTEFIRSTNAMENOT EXISTS
;WITH CTE AS (
SELECT *
FROM USERS
WHERE FIRSTNAME = 'JANE'
)
SELECT FIRSTNAME,LASTNAME
FROM CTE
UNION ALL
SELECT FIRSTNAME,LASTNAME
FROM USERS
WHERE NOT EXISTS (
SELECT 1
FROM CTE
)
sqlfiddle
uj5u.com熱心網友回復:
你可以做這樣的事情——也許 SQL 方言之間的語法略有不同。'John'在子查詢中的分析函式的子句中查找出現order by- 那是你應該有你的系結變數的地方。
select first_name, last_name
from (
select first_name, last_name,
dense_rank() over (order by case first_name
when 'John' then 1 end) as rn
from users
)
where rn = 1
;
這是如何作業的:case當名字是John(或輸入的任何內容)時,運算式分配值 1,null否則。因此,要么某些行被分配 1 和其他null,要么所有行都被分配null。分析dense_rank函式將為具有非空值的行分配 1,為已分配的行分配 2 null,否則,如果在運算式中分配了所有行,它將為所有行分配 1。然后外層查詢只選擇dense rank為1的行;這些都是“John”行,如果有的話,否則它會選擇所有行。nullcase
uj5u.com熱心網友回復:
當名稱匹配或在表中沒有匹配該名稱時,您希望選擇一行。幾乎逐字翻譯成 SQL:
SELECT *
FROM users
WHERE firstname = 'JOHN'
OR NOT EXISTS (SELECT * FROM users WHERE firstname = 'JOHN');
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467492.html
