SQL:测试数字是否包含另一个数字的数字

时间:2011-04-30 22:46:05

标签: sql

我有兴趣使用SQL来测试存储在DOW列中的一个数字是否包含另一个数字的数字,也存储在DOW中,而不管其他数字是否分开。以下是我正在使用的当前数字,虽然我将来可能还有更多要处理的事情:

23
236个
1234
12346个
123456个
67

如果查询针对236检查123456,则需要返回true。反之亦然,236对123456返回false。另一个例子是1234在对23检查时返回true,但是当对12346检查时67返回false。如果我在这个问题中没有提供足够的信息,请要求澄清。

我的查询的简化版本:

SELECT t1.DOW, t2.DOW  
FROM table t1, table t2  
WHERE /* t2.DOW contains all digits regardless of separation in t1.DOW */

谢谢!

4 个答案:

答案 0 :(得分:0)

这可以作为存储过程处理,该过程将值转换为字符串并检查模式值中每个数字的字符串。

存储过程的内容将具有类似

的内容
   function has_digits (pattern, value)
   string s = string (value)
   count = 0
   for each char in pattern
      if instr (s, char) > 0  // for mysql
         count = count + 1
   return count == pattern.length()

(具体细节取决于使用哪种SQL风格。) 这将像

一样使用
SELECT *
 FROM sometable
 WHERE has_digits (236, somefield);

答案 1 :(得分:0)

仅限 MySQL

CREATE TABLE num          --- a help table
( i INT PRIMARY KEY
) ;

INSERT INTO num
VALUES
  (1), (2), (3), (4)
, (5), (6), (7), (8)
, (9),(10),(11),(12) 
,(13),(14),(15),(16)
,(17),(18),(19),(20) ;    --- maximum number of digits = 20

然后,您可以使用此(可怕)查询,该查询首先将数字转换为字符串,并在每个数字之间添加%23将转换为'%2%3%')然后测试{如果23456包含23:

,则匹配{1}}
WHERE 23456 LIKE '%2%3%

SELECT t1.DOW , t2.DOW , (t1.DOW LIKE test) AS t1_contains_t2 FROM t1 JOIN ( SELECT t2.DOW , CONCAT( '%' , GROUP_CONCAT( SUBSTRING( t2.DOW, num.i, 1 ) ORDER BY num.i SEPARATOR '%' ) , '%' ) AS test FROM t2 JOIN num ON (SUBSTRING(t2.DOW,num.i,1) != "" ) GROUP BY t2.DOW ) AS temp ; 列将包含1或0,具体取决于t1.DOW是否包含t2.DOW

或者您可以在查询中使用t1_contains_t2

答案 2 :(得分:0)

我认为DOW是星期几,只有数字1-7

SELECT T1.DOW,T2.DOW
FROM T1,T2
WHERE NOT EXISTS(SELECT *
                 FROM (VALUES('%1%'),
                             ('%2%'),
                             ('%3%'),
                             ('%4%'),
                             ('%5%'),
                             ('%6%'),
                             ('%7%')) Nums(N)
                 WHERE (T2.DOW LIKE N AND T1.DOW NOT LIKE N))

SQL Server 2008通过AFAIK回答这是标准SQL。

答案 3 :(得分:0)

首先,我想确保每个人都明白我坚信这应该存储在程序中。而且,我明天可能会花大部分时间试图找出适合我即将写的内容的惩罚。

我们假设我们有两个表。第一个表包含我们要搜索的数字。

CREATE TABLE search_digits (
  digit integer NOT NULL
);
INSERT INTO search_digits VALUES (2), (3);

我们要搜索数字2和3。

第二个表包含我们要在其中搜索的值。

CREATE TABLE dow_digits (
  dow integer NOT NULL,
  digit integer NOT NULL,
  CONSTRAINT dow_digits_pkey PRIMARY KEY (dow, digit),
);
INSERT INTO dow_digits VALUES (23, 2);
INSERT INTO dow_digits VALUES (23, 3);
INSERT INTO dow_digits VALUES (236, 2);
INSERT INTO dow_digits VALUES (236, 3);
INSERT INTO dow_digits VALUES (236, 6);
INSERT INTO dow_digits VALUES (1234, 1);
INSERT INTO dow_digits VALUES (1234, 2);
INSERT INTO dow_digits VALUES (1234, 3);
INSERT INTO dow_digits VALUES (1234, 4);
INSERT INTO dow_digits VALUES (12346, 1);
INSERT INTO dow_digits VALUES (12346, 2);
INSERT INTO dow_digits VALUES (12346, 3);
INSERT INTO dow_digits VALUES (12346, 4);
INSERT INTO dow_digits VALUES (12346, 6);
INSERT INTO dow_digits VALUES (123456, 1);
INSERT INTO dow_digits VALUES (123456, 2);
INSERT INTO dow_digits VALUES (123456, 3);
INSERT INTO dow_digits VALUES (123456, 4);
INSERT INTO dow_digits VALUES (123456, 5);
INSERT INTO dow_digits VALUES (123456, 6);
INSERT INTO dow_digits VALUES (67, 6);
INSERT INTO dow_digits VALUES (67, 7);

我们可以通过一个简单的查询找到包含数字2和3的dow的至少一些值。

select d1.dow from dow_digits d1
inner join search_digits d2 on d1.digit = d2.digit
group by dow
having count(distinct d1.digit) = (select count(distinct digit) 
                                   from search_digits);

dow
--
23
236
1234
12346
123456

这似乎有效。如果搜索整数是233,那么OP不太清楚,所以我现在要忽略这种情况。我想快点完成,然后走在卡车前面。

接下来的问题是,我们可以动态构建search_digits吗?在PostgreSQL中,有点像。

SELECT UNNEST(ARRAY[2,3]) as digit;

digit
--
2
3

删除表search_digits,并将其包装在CTE中。

with search_digits as (
    select unnest(array[2,3]) as digit
)
select d1.dow from dow_digits d1
inner join search_digits d2 on d1.digit = d2.digit
group by dow
having count(distinct d1.digit) = (select count(distinct digit) 
                                   from search_digits);

dow
--
23
236
1234
12346
123456

下一个问题。我们可以动态构建dow_digits吗?在PostgreSQL中,有点像。需要知道最长数字中有多少位数。我们说不超过六个。

select dow, digit 
from (select dow, unnest(array[substring((dow)::text from 1 for 1),
                               substring((dow)::text from 2 for 1),
                               substring((dow)::text from 3 for 1),
                               substring((dow)::text from 4 for 1),
                               substring((dow)::text from 5 for 1),
                               substring((dow)::text from 6 for 1)]) digit
      from dow ) d
where d.digit <> '';

dow     digit
--
23      2
23      3
236     2
236     3
236     6
1234    1
1234    2
1234    3
1234    4
12346   1
12346   2
12346   3
12346   4
12346   6
123456  1
123456  2
123456  3
123456  4
123456  5
123456  6
67      6
67      7
233     2
233     3
233     3

将所有内容整合到一个语句中。 。

with search_digits as (
    select unnest(array[1,2,3,4,6]) digit
)
select dow
from (select dow, digit 
      from (select dow, unnest(array[substring((dow)::text from 1 for 1),
                                   substring((dow)::text from 2 for 1),
                                   substring((dow)::text from 3 for 1),
                                   substring((dow)::text from 4 for 1),
                                   substring((dow)::text from 5 for 1),
                                   substring((dow)::text from 6 for 1)]) digit
            from dow
            ) arr
      where arr.digit <> ''
      ) d
inner join (select distinct digit from search_digits) sd 
        on  sd.digit = d.digit::integer
group by dow
having count(distinct d.digit) = (select count(distinct digit) 
                                  from search_digits)

dow
--
12346
123456

哦,我可以感觉到业力点滑落了。 。 。那辆卡车在哪里?