允许在同一列上使用 Exact 或 Contains 语句的 SQL WHERE 子句

问题描述 投票:0回答:2

我想返回发票号码,如果它包含一个值或者是一个精确值,其中精确值优先于包含值。

例如发票号码是 123 和 1234。

我想写 - 示例 1:

INPUT1 = '123'
INPUT2 = ''

SELECT
    *
FROM 
    TABLE
WHERE 
    INV_NUM = INPUT1
    OR INV_NUM LIKE '%INPUT2%'

结果同时返回 123 和 1234。

期望的结果是仅返回 123。

但是,如果我不知道确切的数字,我想使用 input2 来查找 contains - 示例 2:

INPUT1 = ''
INPUT2 = '4'

-- same statement
SELECT
    *
FROM  
    TABLE
WHERE 
    INV_NUM = INPUT1
    OR INV_NUM LIKE '%INPUT2%'

由于

or
,结果应返回 123 和 1234。

期望的结果是仅返回 1234。

我该如何编写它,使其优先考虑完全匹配,但如果完全匹配为空,则仅使用包含输入?

如果重要的话,使用 Oracle。

sql oracle
2个回答
1
投票

您可以根据优先级对行进行排序,然后仅获取优先级最高的行:

SELECT *
FROM   table_name
WHERE  INV_NUM = :INPUT1
OR     INV_NUM LIKE '%' || :INPUT2 || '%'
ORDER BY CASE WHEN INV_NUM = :INPUT1 THEN 1 ELSE 2 END
FETCH FIRST ROW WITH TIES;

0
投票

你可以尝试下面的方法。

SELECT *
FROM Invoice
WHERE INV_NUM = INPUT1
      OR NOT EXISTS (SELECT 1 FROM Invoice WHERE INV_NUM = INPUT1) 
         AND INV_NUM LIKE '%'||INPUT2||'%';
© www.soinside.com 2019 - 2024. All rights reserved.