Sql server 2008 用前导0将数字追加到字符串的前面

Sql server 2008 用前导0将数字追加到字符串的前面,sql-server-2008,tsql,append,prefix,Sql Server 2008,Tsql,Append,Prefix,如何正确地将第一个字符替换为“M”?假设您有一个患者ID,其值为'M001',我们希望结果为1001 UPDATE [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_SRC_BIOMETRICS] SET PATIENT_ID = CONVERT(NUMERIC(22,0),'1' + CONVERT(NVARCHAR(50),PATIENT_ID)) WHERE SUBSTRING(PATIENT_ID_NONNUM, 1, 1) = 'M' 编辑: 我建议这样做: UPDAT

如何正确地将第一个字符替换为“M”?假设您有一个患者ID,其值为'M001',我们希望结果为1001

UPDATE [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_SRC_BIOMETRICS]
SET PATIENT_ID = CONVERT(NUMERIC(22,0),'1' + CONVERT(NVARCHAR(50),PATIENT_ID))
WHERE SUBSTRING(PATIENT_ID_NONNUM, 1, 1) = 'M'
编辑:


我建议这样做:

UPDATE [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_SRC_BIOMETRICS]
SET PATIENT_ID = CAST(('1' + SUBSTRING(PATIENT_ID_NONNUM, 2, LEN(PATIENT_ID_NONNUM) - 1)) AS NUMERIC(22,0))
WHERE SUBSTRING(PATIENT_ID_NONNUM, 1, 1) = 'M'
这将查找第一个字符为
M
的所有记录,并将第一个字符替换为
1
。我还没有测试过这个,但我相信它应该能正常工作

我还建议不要在生产数据库上运行这种类型的操作作为测试,我假设这就是
-PROD
在您的目录名称中的含义

编辑:因为这个查询以数字(22,0)的形式显示患者ID似乎很重要,所以我添加了必要的强制转换。

我发现(一个经常被忽略的函数)和
LEFT()
更具可读性,但其他人可能不同意:

UPDATE [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_SRC_BIOMETRICS]
SET PATIENT_ID = CAST(STUFF(PATIENT_ID_NONNUM, 1, 1, '1') AS NUMERIC(22,0))
WHERE LEFT(PATIENT_ID_NONNUM, 1) = 'M'

我总是忘记
东西
,因为我对SQL做得不够:)+1@NathanWheeler嗯,反正这真的是一个品味的问题。大多数人都熟悉
子字符串
,但可能不熟悉
东西
,因此你可以说
子字符串
实际上更清晰。编辑看起来很接近,但似乎有很多无意义的转换。我将在上面进行评论。在编辑中,您似乎正在将字符串
1
转换为字符串,然后将其转换为精度为22、刻度为0的数字,并添加
PATIENT\u ID\u NONNUM
列的子字符串。如果我没弄错的话,因为你在给一个数字加一个字符串,它会自动将两者转换成一个数字,然后(字面上)把它们加在一起。换句话说,您将得到
1
PATIENT\u ID\u NONNUM
列的子字符串之和。这就是为什么在我的示例中,
1
用单引号引起来,这样它就可以连接起来,而不是添加。我已经验证过,将字符串添加到一个数字中会导致两个数字的总和,或者如果字符串无法转换为数字,则会导致错误。换句话说,
SELECT x=1+'1'
会导致
x=2
,而不是
x=11
。您需要为
x=11
选择x=CAST('1'+'1'作为数字(22,0))。
UPDATE [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_SRC_BIOMETRICS]
SET PATIENT_ID = CAST(STUFF(PATIENT_ID_NONNUM, 1, 1, '1') AS NUMERIC(22,0))
WHERE LEFT(PATIENT_ID_NONNUM, 1) = 'M'