这些查询可以在SQL中完成吗?选择任何FROM系统
SELECT dates FROM system
WHERE dates > 'January 5, 2010' AND dates < 'January 30, 2010'
SELECT number FROM system
WHERE number > 10 AND number < 20
我想创建一个generate_series
,这就是为什么我问。
这些查询可以在SQL中完成吗?选择任何FROM系统
SELECT dates FROM system
WHERE dates > 'January 5, 2010' AND dates < 'January 30, 2010'
SELECT number FROM system
WHERE number > 10 AND number < 20
我想创建一个generate_series
,这就是为什么我问。
我假设你想根据系列中的第一个和最后一个值生成任意数量值的记录集。
在PostgreSQL
:
SELECT num
FROM generate_series (11, 19) num
在SQL Server
:
WITH q (num) AS
(
SELECT 11
UNION ALL
SELECT num + 1
FROM q
WHERE num < 19
)
SELECT num
FROM q
OPTION (MAXRECURSION 0)
在Oracle
:
SELECT level + 10 AS num
FROM dual
CONNECT BY
level < 10
在MySQL
:
对不起。
不知道这是否就是你'如果你想从桌上选择一些东西,你可以使用'DUAL'
select 1, 2, 3 from dual;
将返回一行3列,包含这三位数字。
从dual中选择对于运行函数很有用。可以使用手动输入运行功能,而不是选择其他功能。例如:
select some_func('First Parameter', 'Second parameter') from dual;
将返回some_func的结果。
在SQL Server中,您可以使用BETWEEN
关键字。
链接: http://msdn.microsoft.com/nl-be/library/ms187922(en-us).aspx
这可以用在where子句之外吗?或者,可以使用where子句而不是从表中选择? – 2010-02-19 17:42:49
只需要记住,BETWEEN包含边界,而OP的例子不包括它们。 – DyingCactus 2010-02-19 17:43:16
您可以通过使用WHERE
和AND WHERE
选择范围。我不能对演出说话,但可能。
你可以。但是AFAIK,从表格或视图中选择时必须使用'WHERE'。这个问题似乎在问如何生成日期或数字,即不是从已经填充的表或视图中生成日期或数字。 – 2010-02-19 17:44:42
什么是'和哪里'? – 2010-02-19 18:10:31
在Oracle
WITH
START_DATE AS
(
SELECT TO_CHAR(TO_DATE('JANUARY 5 2010','MONTH DD YYYY'),'J')
JULIAN FROM DUAL
),
END_DATE AS
(
SELECT TO_CHAR(TO_DATE('JANUARY 30 2010','MONTH DD YYYY'),'J')
JULIAN FROM DUAL
),
DAYS AS
(
SELECT END_DATE.JULIAN - START_DATE.JULIAN DIFF
FROM START_DATE, END_DATE
)
SELECT TO_CHAR(TO_DATE(N + START_DATE.JULIAN, 'J'), 'MONTH DD YYYY')
DESIRED_DATES
FROM
START_DATE,
(
SELECT LEVEL N
FROM DUAL, DAYS
CONNECT BY LEVEL < DAYS.DIFF
)
如果你想获得天的列表中,用SQL像
选择...如天凡date
是“2010-01-20”和“2010-01-24”
与回报之间像数据:
days
----------
2010-01-20
2010-01-21
2010-01-22
2010-01-23
2010-01-24
该解决方案使用任何循环,过程或临时表。子查询会生成最近一千天的日期,并且可以根据需要将其延长到最后或前进。
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2010-01-20' and '2010-01-24'
输出:
Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20
注意事项性能
测试出来here,表现出奇的好:上面的查询需要0.0009秒。
如果我们扩展子查询来生成约。 100,000个数字(因此约274年的日期),它运行在0.0458秒。顺便说一下,这是一种非常便携的技术,可以在大多数数据库中进行微小的调整。
这个问题的最简单的解决方案是一个Tally或Numbers表。这是只存储整数和/或日期
Create Table dbo.Tally (
NumericValue int not null Primary Key Clustered
, DateValue datetime NOT NULL
, Constraint UK_Tally_DateValue Unique (DateValue)
)
GO
;With TallyItems
As (
Select 0 As Num
Union All
Select ROW_NUMBER() OVER (Order By C1.object_id) As Num
From sys.columns as c1
cross join sys.columns as c2
)
Insert dbo.Tally(NumericValue, DateValue)
Select Num, DateAdd(d, Num, '19000101')
From TallyItems
Where Num
一旦填充该表的序列表,你永远不需要去碰它,除非你想将其展开。我把日期和数字合并成一张表,但如果你需要更多的数字而不是日期,那么你可以把它分成两张表。另外,我随意填充了100K行的表格,但显然可以增加更多。 1900-01-01至9999-12-31之间的每天大约需要434K行。你可能不需要那么多,但即使你做了,存储也很小。
无论如何,这是解决许多空白和序列问题的常用技术。例如,您的原始查询全部运行时间不到十分之一秒。您也可以使用这种类型的表来解决间隙问题,如:
Select NumericValue
From dbo.Tally
Left Join MyTable
On Tally.NumericValue = MyTable.IdentityColumn
Where Tally.NumericValue Between SomeLowValue And SomeHighValue
目前尚不清楚您要问什么。你有什么问题?你问你是否可以查询所有数据库中的所有表,或者你问是否可以查询名为“system”的表?第二个例子应该可以正常工作。第一个例子不会像你想象的那样工作,那是两段文本,而不是日期。您需要以适当的格式存储日期。 – Tom 2010-02-19 17:29:28
我认为他们的意思是简单的查询,以获取给定范围之间的日期或数字列表。 – MartW 2010-02-19 17:31:17
@Tom:我假设他要求'generate_series'。 – Quassnoi 2010-02-19 17:31:34