SQL版的CONCAT和LIMIT

时间:2013-11-29 10:50:41

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

尝试按照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版本的查询。

3 个答案:

答案 0 :(得分:2)

SQL Server等效限制为TOP。 e.g

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函数

答案 1 :(得分:1)

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

答案 2 :(得分:1)

假设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