【问题标题】:SQL Nested SelectSQL 嵌套选择
【发布时间】:2010-10-04 08:00:08
【问题描述】:

我正在尝试构建一个执行以下操作的 sql 选择语句:

SELECT GetDate() Mon, GetDate() Tues

但我也希望能够对每一列(周一、周二)设置 WHERE 限制。所以我想要这样的东西,但它不正确:

SELECT (GetDate() Mon WHERE (1=1)), (GetDate() TuesWHERE (1=1))

请指出正确的方向,谢谢。

【问题讨论】:

  • 你能指定你想要得到的结果类型吗?
  • 我不明白你想在这里完成什么。
  • Oliver S:你的问题没有意义,因为示例查询没有返回任何有用的信息。描述你真正想做的事情,人们可能会给你更相关的答案。
  • 我猜 GETDATE() 函数和“WHERE 1=1”只是示例,实际上他的查询要复杂得多。在这种情况下,Terrapin 的答案可能是他正在寻找的,以维护列名。只需替换真正的函数和 where 子句。

标签: sql select


【解决方案1】:

这是一个将日期时间和星期几作为输入的函数。它返回最近的日期与一周中的那一天。

假定 DATEFIRST 为 7(使星期日为第 1 天)。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_getDateFromDayName]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[udf_getDateFromDayName]
GO

--Set Sunday to be day one
SET DATEFIRST 7
GO

CREATE FUNCTION [dbo].[udf_getDateFromDayName] 
(
    @dtsMaxDate DATETIME,
    @sDayName VARCHAR(8)
)
RETURNS DATETIME
AS
BEGIN

    DECLARE @iDayNumber INT, @dtsTemp DATETIME

    SET @sDayName = LEFT(UPPER(@sDayName),3)

    SET @iDayNumber =
        ( CASE
             WHEN @sDayName = 'SUN' THEN 1
             WHEN @sDayName = 'MON' THEN 2
             WHEN @sDayName = 'TUE' THEN 3
             WHEN @sDayName = 'WED' THEN 4
             WHEN @sDayName = 'THU' THEN 5
             WHEN @sDayName = 'FRI' THEN 6
             WHEN @sDayName = 'SAT' THEN 7
             ELSE 0 --Invalid day
           END
        )

    IF @iDayNumber = 0 RETURN NULL

    SET @dtsTemp = CAST(FLOOR(CAST(@dtsMaxDate AS FLOAT)) AS DATETIME)

    WHILE DATEPART(DW,@dtsTemp) <> @iDayNumber
        SET @dtsTemp = DATEADD (dd, -1, @dtsTemp)

        RETURN @dtsTemp
END

GO

一旦你有了这个函数,你的查询就很简单了。

你可以这样做:

SELECT  dbo.udf_getDateFromDayName(GETDATE(),'mon') [Mon],
        dbo.udf_getDateFromDayName(GETDATE(),'tue') [Tue],
        dbo.udf_getDateFromDayName(GETDATE(),'wed') [Wed],
        dbo.udf_getDateFromDayName(GETDATE(),'thu') [Thu],
        dbo.udf_getDateFromDayName(GETDATE(),'fri') [Fri],
        dbo.udf_getDateFromDayName(GETDATE(),'sat') [Sat],
        dbo.udf_getDateFromDayName(GETDATE(),'sun') [Sun]

或者理想情况下,首先将最大日期放入变量中:

DECLARE @dtsNow DATETIME
SET @dtsNow = GETDATE()
SELECT  dbo.udf_getDateFromDayName(@dtsNow,'mon') [Mon],
        dbo.udf_getDateFromDayName(@dtsNow,'tue') [Tue],
        dbo.udf_getDateFromDayName(@dtsNow,'wed') [Wed],
        dbo.udf_getDateFromDayName(@dtsNow,'thu') [Thu],
        dbo.udf_getDateFromDayName(@dtsNow,'fri') [Fri],
        dbo.udf_getDateFromDayName(@dtsNow,'sat') [Sat],
        dbo.udf_getDateFromDayName(@dtsNow,'sun') [Sun]

【讨论】:

    【解决方案2】:

    GetDate() 只检索当前日期/时间。

    因此,您所有的原始查询(以及迄今为止的大多数“答案”)所做的就是两次检索当前日期和时间,然后在其上放置“星期一”和“星期二”列标签。

    这真的是你想要的吗?

    【讨论】:

      【解决方案3】:

      您可能想要CASE 声明吗?

      或者您是否真的想获得最近的星期一/星期二/星期三/等等?

      【讨论】:

        【解决方案4】:

        列名:

        select
            (select getDate() where (1=1)) Mon,
            (select getDate() where (2=2)) Tues
        

        【讨论】:

        • 我会冒昧地猜测 GETDATE 函数和 WHERE 1=1 只是示例,实际上他的查询要复杂得多。在这种情况下,Terrapin 的答案可能是他正在寻找的,以维护列名。只需替换真正的函数和 where 子句。
        【解决方案5】:
        SELECT (select GetDate() Mon WHERE (1=1)), (select GetDate() Tues WHERE (1=1))
        

        【讨论】:

        • SELECT (select GetDate() WHERE (1=1)) Mon, (select GetDate() WHERE (1=1)) 星期二
        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        相关资源
        最近更新 更多