Sql server SELECT子句中的大小写如何影响SQL Server中的结果集?

Sql server SELECT子句中的大小写如何影响SQL Server中的结果集?,sql-server,select,case,Sql Server,Select,Case,我在SQL Server中面临一种奇怪的行为。我有一个关于如何返回233行的问题,这很好 问题是如果我在一个案例中添加一个条件,那么,她返回48行。怎么可能呢?CASE不应该改变我的结果:它是SELECT子句中的一个CASE,上面没有WHERE 请参见下面的查询。**是更改整个查询结果的条件 SELECT * FROM ( SELECT CASE WHEN dq.type_of_cover = 'ndd' AND ah.type_of_cover = 'ndaa' THEN ah.ty

我在SQL Server中面临一种奇怪的行为。我有一个关于如何返回233行的问题,这很好

问题是如果我在一个案例中添加一个条件,那么,她返回48行。怎么可能呢?CASE不应该改变我的结果:它是SELECT子句中的一个CASE,上面没有WHERE

请参见下面的查询。**是更改整个查询结果的条件

SELECT * FROM (
SELECT
CASE 
    WHEN dq.type_of_cover = 'ndd' AND ah.type_of_cover = 'ndaa' THEN ah.type_of_cover 
    ELSE dq.type_of_cover 
END AS type_of_cover,
CASE 
    WHEN (dq.type_of_cover = 'CCD' AND dq.result_code = 'CCP') THEN NULL --a.mntgex
    WHEN (ah.type_of_cover = 'ndaa' *** AND ah.date = GETDATE() ***) THEN ah.first_amount
    ELSE ISNULL(dq.first_amount, 0)
END AS problem,
dq.active
FROM (
    SELECT du.coddeb, du.coduti
    FROM cacheDebiteurConsolideByUtilisateur AS du
    WHERE du.coduti = 4102
) AS debi
INNER JOIN DecisionQueue AS dq ON dq.coddeb = debi.coddeb
OUTER APPLY (
    SELECT TOP 1 type_of_cover,  MIN(date) AS date, first_amount, coddeb, codadh 
    FROM AtradiusCLHistory
    WHERE codadh = 1003
    AND dq.coddeb = coddeb
    GROUP BY type_of_cover, first_amount, coddeb, codadh
) AS ah
WHERE dq.codadh = 1003
AND dq.cancelled != 1
) AS test 
WHERE type_of_cover = 'ndaa' AND active = 1    

因此,当我在“问题”案例中得到和ah.date=GETDATE()时,我有48行,而不是233行。

这是因为GETDATE()返回当前日期时间(而不是日期),除非您有完全匹配的行,否则将无法返回它们。如果ah.date是日期列,则可以将getdate强制转换为日期。(顺便说一句,使用保留字命名列是一个坏主意,因此它会使名称模棱两可,你不知道它的意思)谢谢你的回答。嗯,我试图转换GETDATE(),但它没有改变任何东西。我仍然有48行返回。我不明白,select中的一个案例如何影响结果,就像他是WHERE子句一样?我更改了列名,但结果仍然相同:/简言之,大小写表达式不会过滤行。您的查询似乎过于复杂。简化您的查询将是调试这个问题的一个良好开端。我同意您的看法。但确实如此。不过,我会尽量简化它。我知道子查询是无用的,所有的(它不是我的,我想帮助一位同事)都不能。这根本不是sql的工作方式。可能还有一些其他级别的过滤导致它以这种方式运行,但仅仅是case表达式的存在不会改变返回的行数。除非你提供更多的细节,否则不可能进一步帮助你。sqlfiddle.com将是一个很好的起点。