我想返回发票号码,如果它包含一个值或者是一个精确值,其中精确值优先于包含值。
例如发票号码是 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。
您可以根据优先级对行进行排序,然后仅获取优先级最高的行:
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;
你可以尝试下面的方法。
SELECT *
FROM Invoice
WHERE INV_NUM = INPUT1
OR NOT EXISTS (SELECT 1 FROM Invoice WHERE INV_NUM = INPUT1)
AND INV_NUM LIKE '%'||INPUT2||'%';