sql - 如何将字符串与动态数字或字符连接起来,并在 MS Access db 的 WHERE 和 JOIN 子句中使用它
问题描述
我被要求在 MS Access Db 中添加一个查询。我认为这应该很容易,但是我在 SQL Server 中使用的代码不起作用。
有两个具有公共字段的表。问题是,在一个表中,该字段始终为 8 个字符长度,前导 0(前导 0 的数字),而在另一个表中,只是一个没有前导 0 的数字。这两个字段的数据类型都是短文本。
因此,在 table1 字段中,DIS 将是 00000003,在 table2 字段中,DIS 将是 3,或者,00000022 和 22 指的是相同的值。
所以,要在 MS SQL Server 中运行 WHERE 或 JOIN,我可以做这样的事情
SELECT t1.field1, t1.field2
FROM t1
WHERE t1.DIS = Replicate('0', 8-Len(t1.DIS)) + '3'
OR
SELECT t1.field1, t2.field1
FROM t1
INNER JOIN t2 ON t1.DIS = Replicate('0', 8-Len(t2.DIS) +'22'
我试图在 MS Access 中执行类似的操作,但出现数据不匹配错误。
SELECT t1.field1, t1.field2
FROM t1
WHERE t1.DIS = String(8 - LEN(t1.DIS),'0') & '3';
“条件表达式中的数据类型不匹配”是表达式“LEN(t1.DIS)”。我试图将其转换为整数,我认为 CInt 和其他一些方法,但似乎没有任何效果。如果我用数字替换表达式并遵循它就可以了
String(8 - 1,'0') & '3'
谢谢
解决方案
另一种方法是将值作为整数进行比较:
SELECT t1.field1, t2.field1
FROM t1 INNER JOIN
t2
ON CINT(t1.DIS) = CINT(t2.DIS)
对于更大的数字,您可以使用CDEC()
:
ON CDEC(t1.DIS) = CDEC(t2.DIS)
推荐阅读
- oracle - 在 pl/sql 中具有连接的循环变量
- macos - AppleScript:编辑完整编写的脚本购买“删除”某些命令,但保留它以便您记住它
- excel - 来自 Excel 的电子邮件导致 excel 挂起
- sql-server - Azure Synapse Analytics 中的递归查询
- windows - ffmpeg:如何将 SSIM 和 PSNR 保存到文件中?
- javascript - 不使用 App.vue 时带有 Vite 的 Vue 3 渲染空白页面
- sql - 为什么连接查询给出与子查询不同的结果?
- java - 反射检查包含类中是否存在字段
- vue.js - 从 Nuxt 上传到 AWS S3 存储桶时出现 500 内部服务器错误
- perl - 如何用 Perl 提取某些行?