我在下面的表格中有如下样本数据:
prod seq catid
-------------------
prod1 0 10
prod1 1 20
prod1 2 30
prod1 3 40
prod2 0 10
prod3 0 10
prod3 1 20
prod3 2 30
prod4 0 10
我需要根据catid列查询上面的表格。 例如:如果我用catid - 10查询,那么我需要获得所有产品(这里prod2,prod3,prod4),其中只有catid为10,其他所有产品都应排除在外。 同样的方式如果我用catid = 10 20 30查询然后我需要输出为prod3,如果我用catid查询为10 20 30 40那么我的输出应该是prod1。
SELECT * FROM table WHERE catid = ALL (1,2,3,4,5)
我在查询中尝试使用ALL,但我无法获得所需的输出,请帮助。
答案 0 :(得分:1)
您可以使用查询获得预期的prod
值:
SELECT prod
FROM mytable
GROUP BY prod
HAVING COUNT(DISTINCT catId) = 5 AND
COUNT(CASE WHEN catId NOT IN (1,2,3,4,5) THEN 1 END) = 0
上述查询会返回具有5
不同 catId
值的产品。这些值中的任何一个都不属于(1,2,3,4,5)
个值集。
答案 1 :(得分:0)
执行此操作的一种方法是使用条件聚合:
#! /bin/csh -f
set begDate_r = `date +%s`
set endDate_r = `date +%s`
set secs = `echo "$endDate_r - $begDate_r" | bc`
set h = `echo $secs/3600 | bc`
set m = `echo "$secs/60 - 60*$h" | bc`
set s = `echo $secs%60 | bc`
echo "Formatted Time: $h HOUR(s) - $m MIN(s) - $s SEC(s)"
答案 2 :(得分:0)
这是一种更通用的方法 - 它依赖于您将字符串传递给查询中包含逗号分隔列表(无空格)的查询:
WITH your_table AS (SELECT 'prod1' prod, 0 seq, 10 catid FROM dual UNION ALL
SELECT 'prod1' prod, 0 seq, 20 catid FROM dual UNION ALL
SELECT 'prod1' prod, 0 seq, 30 catid FROM dual UNION ALL
SELECT 'prod1' prod, 0 seq, 40 catid FROM dual UNION ALL
SELECT 'prod2' prod, 0 seq, 10 catid FROM dual UNION ALL
SELECT 'prod3' prod, 0 seq, 10 catid FROM dual UNION ALL
SELECT 'prod3' prod, 0 seq, 20 catid FROM dual UNION ALL
SELECT 'prod3' prod, 0 seq, 30 catid FROM dual UNION ALL
SELECT 'prod4' prod, 0 seq, 10 catid FROM dual)
-- end of mimicking your table with sample data in it
-- see sql below:
SELECT yt.prod
FROM your_table yt
GROUP BY yt.prod
HAVING min(CASE WHEN ','||:p_string_to_compare||',' LIKE '%,'||yt.catid||',%' THEN 'Y'
ELSE 'N'
END) = 'Y'
AND count(*) = regexp_count(:p_string_to_compare, ',') + 1;
使用:p_string = '10,40,30,20':
PROD
-----
prod1
使用:p_string = '10,20,30':
PROD
-----
prod3
使用:p_string = '10,20':
no rows returned
使用:p_string = '10':
PROD
-----
prod4
prod2