我在表 PriceTerm 中有一个包含各种字符串的 varchar 列。所以我想将其中一些复制到另一列。
所以源名称和格式是
[AdditionalDescription] [varchar](255) NOT NULL
和目的地
[PercentAddition] [decimal](28, 10) NOT NULL
我只想转换那些包含 SQL 选择的 % 的内容:
select AdditionalDescription from PriceTerm where AdditionalDescription like '%[%]%'
输出是这样的。
AdditionalDescription
7,5 %
7,5%
7,5%
6 %
7,5%
6 %
3 %
....
那返回 1696475 行,所以很多。
显然,我必须先删除 % 符号,然后才能将其转换为十进制值。
所以我认为这是几个子步骤。
- 选择要转换的行。通过上面的 SQL 完成。
- 删除 % 所以字符串中只剩下数字。
- 将字符串转换为十进制并将其放在 PercentAddition 列中。
我的问题是如何实施第 2 步和第 3 步?
更新: 我已经尝试过这 2 个 SQL。
SELECT
CONVERT(decimal(28,10), LTRIM(RTRIM(REPLACE(REPLACE([ADDITIONALDESCRIPTION], ',', '.'), '%', ''))))
FROM PriceTerm
WHERE AdditionalDescription like '%[%]%'
SELECT
CAST(LTRIM(RTrim(REPLACE(REPLACE([ADDITIONALDESCRIPTION], ',', '.'), '%', ''))) AS Decimal(28,10))
FROM PriceTerm
WHERE AdditionalDescription like '%[%]%'
两者都返回了相同的错误。
将数据类型 varchar 转换为数字时出错。
但以下工作
SELECT CONVERT(decimal(28,10), LTRIM(RTRIM(REPLACE(REPLACE('5,8%', ',', '.'), '%', '')))) 从 PriceTerm WHERE AdditionalDescription like %[%]%'
我尝试列出那些满足条件但转换失败的人。
从 PriceTerm WHERE(AdditionalDescription like '%[%]%')和 ISNUMERIC( LTRIM(RTRIM(REPLACE(REPLACE([ADDITIONALDESCRIPTION], ',', '.'), '%', '')))) = 0
PercentAddition
express + 30
Express Transport +30
tillägg till faktura 115423. express +30
+ 30 (1.30*42.4sek=55.12sek)
+ 30 (1.30*42.4sek=55.12sek)
7.5*
7.5*
7..5
7..5
7.5.
7.5.
1.5 (minimi 4.20 €)
335 * 25 = 418.75
335 * 25= 418.75
10.6 &
vastaanottajan rahdinmaksu +4
Expressfrakt!!+30
奇怪的是,这些都不包含 % char。
更新 2: 我尝试过滤掉无法使用此 SQL 转换的数据
SELECT AdditionalDescription
FROM PriceTerm
WHERE Created BETWEEN '2004' AND '2005' AND
AdditionalDescription like '%[%]%' AND
PercentAddition = 0 AND
ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.')))) = 0
输出:
AdditionalDescription
Snabbleverans + 30 %
Snabbleverans + 30 %
455 € + 4%
1,5 % (minimi 4,20 €)
1,5 % (minimi 4,20 €)
bränsle 7,5% ingår.
所以这些字符串包含 % 但无法将它们转换为小数。我想跳过那些。
计算有效数字
SELECT Count(*)
FROM PriceTerm
WHERE Created BETWEEN '2004' AND '2005' AND
AdditionalDescription like '%[%]%' AND
PercentAddition = 0 AND
ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.')))) = 1
80051
更新 PercentAddition 列
UPDATE PriceTerm
SET PercentAddition = CONVERT(decimal(28,10), RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.'))))
WHERE Created BETWEEN '2004' AND '2005' AND
AdditionalDescription LIKE '%[%]%' AND
PercentAddition = 0
AND ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.')))) = 1
结果
将数据类型 varchar 转换为数字时出错。
任何人有一个提示的原因?
更新 3:
因此,例如,上面所有那些无法解析的奇怪行都将被跳过。
+ 30 (1.30*42.4sek=55.12sek)
7.5*
7.5*
7..5
以上都转换为0。只有那些会转换为十进制:
7,5% -> 7.5
7,7 % -> 7.7
2.5 -> 2.5
我还试图弄清楚 SQL CASE WHEN 是如何工作的。可能有用吗?试过这个:
UPDATE PriceTerm
SET PercentAddition =
CASE
WHEN ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.')))) = 1 THEN
CONVERT(decimal(28,10), RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.'))))
ELSE
0.0
END
WHERE Created BETWEEN '2004' AND '2005' AND
AdditionalDescription LIKE '%[%]%' AND
PercentAddition = 0
AND ISNUMERIC(RTRIM(LTRIM(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.')))) = 1
输出仍然 将数据类型 varchar 转换为数字时出错。我什至考虑过存储过程,但我以前从未使用过它。SQL Server 2012 有 Try_Convert 在这种情况下非常有用。但我没有为 2008 R2 找到类似的替代方案。