【问题标题】:Cast a new column and then cross compare to another table in where statement转换一个新列,然后在 where 语句中与另一个表进行交叉比较
【发布时间】:2015-04-16 14:22:33
【问题描述】:

我目前正在使用 sql server management studio。我有 2 张桌子。第一个表有2列,col1是smalldatetime,col2也是smalldatetime。第二个表有 3 列,一个 varchar(25) 列、一个位列和一个 smalldatetime 列。

我的问题是:对于表 1,我正在使用 smalldatetime 在第二个表中创建 varchar 字符串。我需要一种方法将 smalldatetime 创建的数字与表 2 中的 varchar 进行交叉比较。我的代码如下:

SELECT Distinct
RIGHT('0' + CAST(DATEPART(M, table1.col1) AS varchar), 2) 
+ RIGHT ('0' + Cast(DATEPART(DD, table1.col1) AS varchar), 2) 
+ RIGHT('0' + CAST(DATEPART(HH, table1.col1) AS varchar), 2) 
+ RIGHT('0' + CAST(DATEPART(MINUTE, table1.col1) AS varchar), 2) AS 'CreatedNumber', table1.col2
FROM table1 WHERE table1.col2 IS NULL 
AND [CreatedNumber] NOT IN (SELECT table2.col1 FROM table2)

我的错误出现在您看到“[CreatedNumber]”的最后一行。问题是这不是一个列名,所以我不能使用我的 creatednumber 列在 where 子句中执行任何类型的函数。我需要使用强制转换函数或创建表来执行此操作吗?

【问题讨论】:

    标签: mysql sql select where


    【解决方案1】:

    你可以这样做:

    SELECT DISTINCT
        tbl.CreatedNumber,
        tbl.col2
    FROM
    (
        SELECT
            RIGHT('0' + CAST(DATEPART(M, table1.col1) AS varchar), 2) 
            + RIGHT ('0' + Cast(DATEPART(DD, table1.col1) AS varchar), 2) 
            + RIGHT('0' + CAST(DATEPART(HH, table1.col1) AS varchar), 2) 
            + RIGHT('0' + CAST(DATEPART(MINUTE, table1.col1) AS varchar), 2) AS 'CreatedNumber', 
            table1.col2
        FROM 
            table1 
    ) AS tbl
    WHERE 
        tbl.col2 IS NULL 
        AND tbl.[CreatedNumber] NOT IN (SELECT table2.col1 FROM table2)
    

    【讨论】:

    • 这似乎有效,但我想确保我了解它在做什么。您是否使用前 13 行创建一个表,然后将其命名为 tbl?
    • @Cheddar :我正在使用子查询来获取数据。原因是不能在 where 语句中直接使用别名列。对您的原始选择进行子查询。我们可以到达连接列并在 where 语句中使用它。有关更多信息,请查看子查询
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2022-12-10
    • 2019-11-14
    相关资源
    最近更新 更多