使用此代码我只会多次获得最后一次注册结果。我希望得到所有结果。 这将是功能。 (我在我的桌子上有像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
答案 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)
;