0

次のサブクエリがSQLServerで機能しない理由はわかりません。サブクエリを単独で実行すると、問題なく機能しますが、追加するとすぐに機能します。

Select * from ([subquery]) as table1

クエリが実行されない場合、SQL Serverは、キーワード'if'の近くに構文が正しくないというエラーを返します。ここにどのような構文エラーが存在し、それ以外の場合はどうして問題なく機能するのでしょうか。

ポインタはありますか?

select * from (

    if datepart(MONTH, getdate()) >= MONTH('1/February/0000') 
    --after february we want the next years semesters, 

        begin
        select top 3 sem_name from semester_dates
         where datepart(year, start_date) < datepart(YEAR, getdate()) and sem_name not like 'summer%'
        end

    else 
        begin
        select top 3 sem_name from semester_dates  sd
        where datepart(year, start_date) >= datepart(YEAR, getdate()) and sem_name not like 'summer%' 
        end

    ) table1
4

7 に答える 7

4

if/elseロジックをテーブル値関数に移動することを検討することをお勧めします。おそらくこのようなもの。注意してください、私はあなたの論理をチェックしませんでした、私はこれを再利用しただけです。それに応じて、以下のコードを調整する必要がある場合があります。

CREATE FUNCTION SemesterNames
(
  @ReferenceDate datetime
)
RETURNS @dates table 
(
  sem_name nvarchar(50) --check the data type
)
AS
BEGIN
  if datepart(MONTH, @ReferenceDate) >= MONTH('1/February/0000') 
    --after february we want the next years semesters, 
    INSERT INTO @dates (sem_name)
    select top 3 sem_name from semester_dates
     where datepart(year, start_date) > datepart(YEAR, @ReferenceDate) and sem_name not like 'summer%'
    end
else 
    INSERT INTO @dates (sem_name)
    select top 3 sem_name from semester_dates  sd
    where datepart(year, start_date) >= datepart(YEAR, @ReferenceDate) and sem_name not like 'summer%' 
END;
GO

SELECT * FROM SemesterNames(GETDATE());
于 2012-12-18T20:39:25.047 に答える
2

IFの代わりにCASEを使用して次のことを試してください。

SELECT *
FROM
(SELECT 
    CASE 
        WHEN datepart(MONTH, getdate()) >= MONTH('1/February/0000')
            THEN
                (SELECT TOP 3 sem_name 
                 FROM semester_dates
                 WHERE datepart(year, start_date) > datepart(YEAR, getdate()) and sem_name not like 'summer%')
        ELSE
                (SELECT TOP sem_name 
                FROM semester_dates
                WHERE datepart(year, start_date) >= datepart(YEAR, getdate()) and sem_name not like 'summer%')
)
于 2012-12-18T20:40:54.013 に答える
1

私が見る限り、条件付きロジックの唯一の効果は、datepart(year、start_date)が厳密に以上であるか以上であるということです。したがって、すべてを次のような単純なクエリに置き換えることができます。

    select top 3 sem_name from semester_dates
    where datepart(year, start_date) >= datepart(YEAR, getdate()) 
    and sem_name not like 'summer%'
    and (
         datepart(MONTH, getdate()) > MONTH('1/February/0000') or 
         datepart(year, start_date) = datepart(YEAR, getdate()
    ) 

つまり、start_dateの年は厳密に> year(getdate())です。ただし、月が> Febの場合、年はそれに等しくなります。

于 2012-12-18T20:49:21.690 に答える
0

If / else構文は、Selectクエリで機能することは想定されていません。

于 2012-12-18T20:32:15.883 に答える
0

この特定のクエリでは、WHERE句にFebruary条件を指定した単一のSELECTを使用して、目的の結果を達成できませんでしたか?

SELECT TOP 3
    Sem_Name
FROM
    semester_dates
WHERE
    sem_name not like 'summer%'
    and 
    (
        (datepart(month, getdate()) >= 2 AND datepart(year, start_date) < datepart(YEAR, getdate()))
        OR
        (datepart(month, getdate()) < 2 AND datepart(year, start_date) >= datepart(YEAR, getdate()))
    )
于 2012-12-18T20:49:15.137 に答える
0
select * from
(select datepart(MONTH, getdate()) >= MONTH('1/February/0000'))
    as department,
(select top 3 sem_name from semester_dates
    where datepart(year, start_date) < datepart(YEAR, getdate()) 
        and sem_name not like 'summer%') 
    as sem_name,
(select top 3 sem_name from semester_dates sd
    where datepart(year, start_date) >= datepart(YEAR, getdate())
        and sem_name not like 'summer%') 
    as top 3 sem_name 
) table
于 2018-12-01T07:02:10.833 に答える
0

BACE WHEN batch.PropertyId IS NULL THEN(SELECT count()FROM vw_UtilMan_InspectionBatchAreaPropertyMeterStatistic WHERE BatchId = batch.Id)ELSE(SELECT COUNT()AS NumberOfMeters FROM UtilMan_Properties prop INNER JOIN AssMan_Assets Meter ON Meter.UtilMan_PropertyId = prop.Id and Meter.IsDelete 0 WHERE prop.IsDeleted=0およびprop.Id=batch.PropertyId)END

于 2022-03-05T07:43:12.377 に答える