[英]SQL parse list of values to find greater than/ less than/ range
我有一个用逗号分隔的值列表的Oracle SQL DB列,作为输入,我有两个数字-我需要确定值列表中的至少一个数字是否在两个输入数字之间。
例:
数据库列内容: '100, 200, 300, 400, 500'
输入:10,100
请求的输出:true(因为100在10和110之间)。
输入:10,80。
请求的输出:false。
有什么办法可以在直接SQL(无PL / SQL)中执行此操作?
您可以使用XMLTABLE
。
Oracle 11g R2架构设置 :
create table yourtable as select '100, 200, 300, 400, 500' nums from dual;
查询1 :
WITH t(n)
AS (SELECT TO_NUMBER (column_value)
FROM yourtable,
XMLTABLE(nums)),
input(min_val, max_val)
AS (SELECT Min(TO_NUMBER(column_value)),
Max(TO_NUMBER(column_value))
FROM XMLTABLE('10,100' ))
SELECT CASE
WHEN EXISTS (SELECT 1
FROM t
WHERE t.n BETWEEN i.min_val AND i.max_val) THEN 'TRUE'
ELSE 'FALSE'
END is_between
FROM input i
结果 :
| IS_BETWEEN |
|------------|
| TRUE |
您可以创建如下函数:
CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;
CREATE OR REPLACE FUNCTION SplitCSV(LIST IN VARCHAR2, Separator IN VARCHAR2) RETURN NUMBER_TABLE_TYPE IS
OutTable NUMBER_TABLE_TYPE := NUMBER_TABLE_TYPE();
BEGIN
SELECT REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL)
BULK COLLECT INTO OutTable
FROM dual
CONNECT BY REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL) IS NOT NULL;
RETURN OutTable;
END;
然后您可以使用它作为示例:
WITH t AS (SELECT '100, 200, 300, 400, 500' AS val FROM dual)
SELECT distinct 'true'
FROM t
CROSS JOIN TABLE(SplitCSV(val, ','))
WHERE COLUMN_VALUE BETWEEN 10 and 80;
或一次选择即可完成所有操作:
WITH t AS
(SELECT TO_NUMBER(REGEXP_SUBSTR('100, 200, 300, 400, 500', '[^,]+', 1, LEVEL)) AS NUMBERS
FROM dual
CONNECT BY REGEXP_SUBSTR('100, 200, 300, 400, 500', '[^,]+', 1, LEVEL) IS NOT NULL)
SELECT case when count(NUMBERS) > 0 then 'TRUE' else 'FALSE' end
FROM t
WHERE NUMBERS BETWEEN 10 AND 80;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.