SQL多次返回最后一次注册的结果

时间:2014-08-18 06:51:44

标签: sql sql-server tsql

使用此代码我只会多次获得最后一次注册结果。我希望得到所有结果。 这将是功能。 (我在我的桌子上有像280x30,360x40的条目我需要2个数字作为变量来计算这些数字的英寸值)

declare @Value1 numeric(18,0)
declare @Value2 numeric(18,0)

select @Value2 = SUBSTRING([Values], CHARINDEX('x', [Values]) + 1, LEN([Values])) ,

@Value1 = SUBSTRING([Values], 1, CHARINDEX('x', [Values]) - 1),

@Value1=@Value1/(2.54),
@Value2=@Value2/(2.54)
from tblValues 

select @Value1 as Value1,
       @value2 as Value2
from tblValues

2 个答案:

答案 0 :(得分:0)

你可以这样做:

SELECT
    tbl.Value1/2.54 AS Value1,
    tbl.Value2/2.54 AS Value2
FROM
(
    select 
        SUBSTRING([Values], CHARINDEX('x', [Values]) + 1, LEN([Values])) as Value2,
        SUBSTRING([Values], 1, CHARINDEX('x', [Values]) - 1) AS Value1
    from 
        tblValues
) AS tbl

答案 1 :(得分:0)

没有使用某些数据的优势。

您可以将CROSS APPLY用于可重复使用的别名,但不仅如此,您可以使用它们来评估条件以帮助避免错误。不确定输入字符串的一致性,但在将字符串转换为数字时,几乎任何事情都可能出错。

- 如果你有sql 2012或更高版本使用TRY_CAST()

SELECT
      TRY_CAST(ca2.Str1 AS numeric) / 2.54 AS Value1
    , TRY_CAST(ca2.Str2 AS numeric) / 2.54 AS Value2
FROM tblValues
      CROSS APPLY (
                  SELECT
                        CHARINDEX('x', [Values])
            ) AS ca1 (pos1)
      CROSS APPLY (
                  SELECT
                        CASE
                              WHEN pos1 > 1 THEN SUBSTRING([Values], ca1.pos1 + 1, LEN([Values])) END
                      , CASE
                              WHEN pos1 > 1 THEN SUBSTRING([Values], 1, ca1.pos1 - 1) END
            ) AS ca2 (Str1, Str2)
;

- 早期版本使用ISNUMERIC,但任何延伸都不是完美的

SELECT
      CASE
            WHEN ISNUMERIC(ca2.Str1) THEN CAST(ca2.Str1 AS numeric) / 2.54 END AS Value1
    , CASE
            WHEN ISNUMERIC(ca2.Str2) THEN CAST(ca2.Str2 AS numeric) / 2.54 END AS Value2
FROM tblValues
      CROSS APPLY (
                  SELECT
                        CHARINDEX('x', [Values])
            ) AS ca1 (pos1)
      CROSS APPLY (
                  SELECT
                        CASE
                              WHEN pos1 > 1 THEN SUBSTRING([Values], ca1.pos1 + 1, LEN([Values])) END
                      , CASE
                              WHEN pos1 > 1 THEN SUBSTRING([Values], 1, ca1.pos1 - 1) END
            ) AS ca2 (Str1, Str2)
;