我有兴趣使用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 */
谢谢!
答案 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:
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
哦,我可以感觉到业力点滑落了。 。 。那辆卡车在哪里?