【问题标题】:SQL Query varchar field with numeric search使用数字搜索的 SQL 查询 varchar 字段
【发布时间】:2014-01-28 01:51:12
【问题描述】:

我创建了一个表格,其中包含一个名为“Notes”的 nvarchar 字段,人们可以输入他们想要的任何内容(数字或文本)以帮助他们进行搜索。

例如

Table "Customer"
ID  Name  Notes
1   AAA   1234
2   BBB   1235
3   CCC   1236
4   DDD   ABCD

根据这些数据,我只想为 1200 到 1300 之间的 Notes 编写 sql 查询,但它不允许我这样做,因为该字段还包含文本值。

我试过了

SELECT * 
FROM Customer
WHERE ISNUMERIC(Notes) = 1 AND Notes > 1200 AND Notes < 1300

错误:将 nvarchar 值转换为 int 时转换失败

然后我尝试了这个,我认为这会起作用,但会出现同样的错误

SELECT *
FROM
 (SELECT *
  FROM Customers
  WHERE ISNUMERIC(Notes) = 1 
 ) A
WHERE A.Notes > 1200 AND A.Notes < 1300

有人可以帮忙吗?非常感谢

【问题讨论】:

  • 用 varchar 表示数值是非常糟糕的做法。仔细想想你为什么需要它,你不能冗余地使用另一列吗?

标签: sql dynamic varchar isnumeric


【解决方案1】:

试试这个:

SELECT * 
FROM Customer
WHERE (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) > 1200 AND
      (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) < 1300

这是有效的,因为case 在这种情况下保证了评估的顺序。你也可以用子查询来写:

select *
from (select c.*,
             (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) as NotesNum
      from Customer c
     ) c
where NotesNum > 1200 and NotesNum < 1300;

或者,这可能会接近您想要的:

SELECT * 
FROM Customer
WHERE ISNUMERIC(Notes) = 1 AND
      Notes > '1200' AND Notes < '1300' and len(notes) = 4 and notes not like '%.%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2022-01-09
    相关资源
    最近更新 更多