从表中选择一个值作为变量而不更改格式?

时间:2018-10-30 10:54:31

标签: sql sql-server formatting

在较大的存储过程中使用与以下类似的代码:

df = pd.DataFrame({'a':[1,2,3,4]})

#slow, working only with unique values
df['b'] = df['a'].apply(lambda x: df.loc[df.a != x, 'a'].mean())
#faster
df['b1'] = (df['a'].sum() - df['a']) / (len(df) - 1)
print (df)
   a         b        b1
0  1  3.000000  3.000000
1  2  2.666667  2.666667
2  3  2.333333  2.333333
3  4  2.000000  2.000000

理论上,以上代码应始终返回与查询相同的结果

DECLARE @Foo NVARCHAR(500)
SET @Foo = (SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)    -- May be numeric or text
SELECT * FROM [MyTable] WHERE [MyColumn] = @Foo

但是,它经常返回SELECT * FROM [MyTable] WHERE ID = 1 。这样做的原因是,变量(0 Rows)并不总是以与表相同的格式存储找到的值。

例如,表可能包含值@Foo。但是,上面的select语句会将其存储为2152437

我试图通过使用代码

解决此问题
@Foo = 2.01512e+007

问题是,尽管它允许大整数以与数据库中找到的格式相同的格式存储在IF ISNUMERIC((SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)) = 1 SET @Foo = Str((SELECT [MyColumn] FROM [MyTable] WHERE ID = 1)) ELSE SET @Foo = (SELECT [MyColumn] FROM [MyTable] WHERE ID = 1) 中,但它会使小数舍入。我也尝试过使用代码

@Foo

但是,这会将多余的0加到找到的值的末尾。因此,这也不是一种选择。

考虑到在数据库中找到的值可能不是数字,我如何在将所选值存储到变量中时保留数据库中使用的格式?

但是,当找到小数时

1 个答案:

答案 0 :(得分:2)

这不是确切的解决方案,但是您可以尝试:

<Modal 
  show={this.state.show} 
  onHide={this.handleClose} 
  bsSize="large" 
  aria-labelledby="contained-modal-title-lg"
>
  <Modal.Header>
    <Modal.Title className="f2 pa0">welcome modal.</Modal.Title>
  </Modal.Header>
  <Modal.Body>
    <ol>
      <li className="mb-3">hello <strong>There</strong>.</li>
      <li className="mb-3">hi!<b>welcome back</b> <i>MR0B</i> to intro.</li>
    </ol>
    <div className="form-group mt-4">
    </div>
  </Modal.Body>
  <Modal.Footer>
    <Button onClick={this.handleClose}>Close</Button>
    <Button className="link dim mb2 dib white bg-purple pointer">continue</Button>
  </Modal.Footer>
</Modal>

但是,我真的很怀疑您要做什么。为什么要将数字值保存在变量中?

第二,您遇到的问题是因为该列是使用浮点表示形式存储的。如果您切换到定点表示形式(SELECT * FROM [MyTable] WHERE CAST([MyColumn] as NVARCHAR(500)) = @Foo; / numeric,则您的代码将按预期工作。这可能是解决此问题的最简单方法。