【问题标题】:Insert a negative value with minus sign at end在末尾插入一个带负号的负值
【发布时间】:2014-04-11 12:44:10
【问题描述】:

我想在 sql server 2008 表中插入一个值。

值类似于20.00-10.00-

减号在值的末尾。

我怎样才能做到这一点?

【问题讨论】:

  • 您要插入数据的表结构是什么?
  • 创建表 t1(c1 numeric(10,5))
  • 为什么不能将提供值的格式更改为普通数字格式?为什么 SQL-Server 应该处理这种疯狂的格式?
  • 作为字符串传入?在客户端将其转换为-N。或插入 -20.00-0 以获取笑声。
  • 某个地方 在来自 SAP 的文件和插入 SQL Server 的数据之间,必须有机会改变这一点。您应该将 data 以最合适的可用数据类型存储在数据库中。

标签: sql sql-server-2008 insert


【解决方案1】:

用这样的东西怎么样?

SELECT REPLACE(CAST(-456.00 AS VARCHAR(10)),'-','') + '-'

456.00 是你的价值

【讨论】:

  • 我不能在我的插入中使用它。但我可以先将 10.00- 作为 varchar 插入,然后我可以更改它 -10.00
【解决方案2】:

您可以先将原始数据插入临时表。然后您可以转换暂存表中的值,然后将它们插入到实际表中,或者同时插入和转换。

以下是您可以进行转换的方法。

对于每个输入值,您都需要检查它是否有减号。如果是这样,则应在最后一个位置删除一个字符,并在第一个位置插入一个字符。否则不应删除或插入任何内容。

所以,基本上你可以用 1 或 0 的形式表示,并使用该数字来确定要插入或删除多少个字符。

有多种方法可以获得 1/0 结果。

例如,您可以将输入值的最后一个字符作为子字符串,并使用 CHARINDEX 在该子字符串中搜索-

CHARINDEX('-', LEFT(InputValue, LEN(InputValue)))

如果InputValue的最后一个字符是'-',则CHARINDEX返回1,否则返回0。

另一种方法,也使用CHARINDEX,是这样的:

CAST(CHARINDEX('-', InputValue) AS bit)

如果InputValue 有负号,CHARINDEX 将返回正结果,CAST 会将其转换为 1。如果没有负号,CHARINDEX 会给您一个 0,在演员表。

现在您可以使用表达式的结果来确定:

  • 是否删除最后一个字符:

    STUFF(InputValue, LEN(InputValue), <b>CAST(CHARINDEX('-', InputValue) AS bit)</b>, '')

  • 是否在值前加上'-':

    REPLICATE('-', <b>CAST(CHARINDEX('-', InputValue) AS bit)</b>)

也就是说,完整的表达式是这样的:

REPLICATE('-', CAST(CHARINDEX('-', InputValue) AS bit)) +
STUFF(InputValue, LEN(InputValue), CAST(CHARINDEX('-', InputValue) AS bit), '')

在最后的语句中,您还可以使用CROSS APPLY 来避免重复强调的子表达式,类似于此行(假设您将选择进行插入+处理):

INSERT INTO dbo.TargetTable (columns)
SELECT
  ...
  REPLICATE('-', x.HasMinus) + STUFF(InputValue, LEN(InputValue), x.HasMinus, ''),
  ...
FROM dbo.StagingTable
CROSS APPLY (SELECT CAST(CHARINDEX('-', InputValue) AS bit)) AS x (HasMinus)
;

【讨论】:

    【解决方案3】:

    它很长,但是:

    select IIF(ISNUMERIC(IIF(RIGHT(RTRIM('20.55-'), 1) = '-', '-' + REPLACE('20.55-', '-',''), '20.55-')) = 1, CONVERT(decimal(7,3), IIF(RIGHT(RTRIM('20.55-'), 1) = '-', '-' + REPLACE('20.55-', '-',''), '20.55-')), NULL)
    

    【讨论】:

    • 你需要转换in varchar
    【解决方案4】:

    简单地说:

    Select CASE WHEN LEFT(InputValue,1) = '-' THEN '-' ELSE '' END + REPLACE(InputValue,'-','')
    

    您可能需要将其转换为货币(或数字或小数)

    【讨论】:

    • 刚刚对你的答案投了反对票,因为试试这个Select CASE WHEN LEFT(InputValue,1) = '-' THEN '-' ELSE '' END + REPLACE(InputValue,'-','')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2020-11-15
    • 2015-02-08
    相关资源
    最近更新 更多