【问题标题】:SQL Version of CONCAT and LIMITCONCAT 和 LIMIT 的 SQL 版本
【发布时间】:2013-11-29 10:50:41
【问题描述】:

尝试跟随Calendar Recurring/Repeating Events - Best Storage Method使用SQL Server 2005设计数据库。

当我在下面运行这个查询时

SELECT EV.*
FROM events EV
RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
RIGHT JOIN events_meta EM2 ON EM2.meta_key = CONCAT( 'repeat_interval_', EM1.id )
WHERE EM1.meta_key = 'repeat_start'
    AND (
        ( CASE ( 1299132000 - EM1.meta_value )
            WHEN 0
              THEN 1
            ELSE ( 1299132000 - EM1.meta_value )
          END
        ) / EM2.meta_value
    ) = 1
LIMIT 0 , 30

我收到'CONCAT' is not a recognized built-in function name.

我搜索了一下,似乎它仅在 SQL Server 2012 中受支持。我如何使用 SQL Server 2005/2008 实现这一点? SQL Server 中的 LIMIT 语法呢?

我想要上面的sql版本的查询。

【问题讨论】:

    标签: mysql sql sql-server database database-design


    【解决方案1】:

    限制的 SQL Server 等效项是 TOP。例如

    SELECT TOP 10 ID
    FROM    Table.
    

    TOP 并不是 LIMIT 的同义词,因为您不能向它传递 2 个参数(例如 LIMIT 10、20)来指定起点。在 SQL Server 2012 中,等效值为 OFFSET FETCH,但在 2005 和 2008 版本中,您需要使用 ROW_NUMBER 并过滤此值,例如

    SELECT  *
    FROM    (   SELECT *, RowNum = ROW_NUMBER() OVER(ORDER BY ID)
                FROM    T
            ) t
    WHERE   t.RowNumber BETWEEN 10 AND 30;
    

    您可以只使用+concatenate strings

    SELECT 'a' + 'b'
    

    SQL Server 2012 引入了CONCAT 函数

    【讨论】:

      【解决方案2】:

      SQL Server 中与 CONCAT() 等效的函数是 +,您可以使用 TOP 关键字来限制结果集。

      将您的查询写成:

      SELECT TOP 30 EV.*
      FROM events EV
      RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
      RIGHT JOIN events_meta EM2 ON EM2.meta_key = 'repeat_interval_' + CAST (EM1.id as varchar(10)) -- cast is required in case id column is int
      WHERE EM1.meta_key = 'repeat_start'
          AND (
              ( CASE ( 1299132000 - EM1.meta_value )
                  WHEN 0
                    THEN 1
                  ELSE ( 1299132000 - EM1.meta_value )
                END
              ) / EM2.meta_value
          ) = 1
      

      【讨论】:

        【解决方案3】:

        假设 EM1.id 是 int 类型,您首先必须将其转换为 varchar要连接使用+ 运算符。并在 Sql-server 中使用 TOP 而不是 LIMIT

        这应该可行:

        SELECT TOP 30 EV.*
        FROM events EV
        RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
        RIGHT JOIN events_meta EM2 ON EM2.meta_key = ('repeat_interval_' + CONVERT(nvarchar(max), EM1.id))
        WHERE EM1.meta_key = 'repeat_start'
            AND (
                ( CASE ( 1299132000 - EM1.meta_value )
                    WHEN 0
                      THEN 1
                    ELSE ( 1299132000 - EM1.meta_value )
                  END
                ) / EM2.meta_value
            ) = 1
        

        【讨论】:

        • 我质疑这是经过测试的事实(至少在正确的 DBMS 上),因为 LIMIT 不是 SQL Server 语法...
        • 哦,谢谢。你当然是对的。更新了代码。我测试了主要问题(串联)。
        猜你喜欢
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 2018-10-03
        相关资源
        最近更新 更多