SQL分析要查找大于/小于/范围的值列表

SQL分析要查找大于/小于/范围的值列表,sql,oracle,Sql,Oracle,我有一个Oracle SQL DB列,其中包含一个逗号分隔的值列表,作为输入,我有两个数字-我需要确定值列表中是否至少有一个数字在两个输入数字之间 示例: DB列内容:'100200300400500' 输入:10100 请求的输出:true(因为100在10和110之间)。 输入:10,80 请求的输出:false 有没有什么方法可以在直接SQL(无PL/SQL)中实现这一点?您可以使用XMLTABLE Oracle 11g R2架构设置: create table yourtable as

我有一个Oracle SQL DB列,其中包含一个逗号分隔的值列表,作为输入,我有两个数字-我需要确定值列表中是否至少有一个数字在两个输入数字之间

示例:
DB列内容:
'100200300400500'

输入:10100
请求的输出: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;
 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   |
查询1

create table yourtable as select '100, 200, 300, 400, 500' nums from dual;
 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 table yourtable as select '100, 200, 300, 400, 500' nums from dual;
 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   |

您可以使用
XMLTABLE

Oracle 11g R2架构设置

create table yourtable as select '100, 200, 300, 400, 500' nums from dual;
 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   |
查询1

create table yourtable as select '100, 200, 300, 400, 500' nums from dual;
 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 table yourtable as select '100, 200, 300, 400, 500' nums from dual;
 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;

您可以创建如下函数:

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;

由于Oracle没有内置的支持来处理逗号分隔的值,我想您必须使用PL/SQL来实现这一点。但是,更好的选择是正确地规范化您的数据模型,因为Oracle没有内置的支持来处理逗号分隔的值,我想您必须使用PL/SQL来实现这一点。然而,更好的选择是正确地规范化数据模型