【问题标题】:how to query a table to find rows where there are no numbers in a column如何查询表以查找列中没有数字的行
【发布时间】:2016-07-21 04:05:16
【问题描述】:

我在SQL Server 2005 中有一个包含数字和characters 的列

注意:这里character 表示除数字以外的任何内容。

我需要列出所有包含字符的记录(数字除外)。如果记录中没有数字,则以下查询将列出记录。但是我需要列出所有包含字符的记录,无论它是否有数字。

如何修改此查询以返回包含至少一个字符的所有记录?

参考

  1. How would I determine if a varchar field in SQL contains any numeric characters?
  2. SQL query for finding rows with special characters only

代码

DECLARE @WorkOrderHistory TABLE (WorkOrder VARCHAR(10))
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('123456') --EXCLUDE from result
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('abvc@@@') --Need to list in result
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('a+bvc1234') --Need to list in result
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('++') --Need to list in result
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('$1') --Need to list in result
INSERT INTO @WorkOrderHistory (WorkOrder) VALUES ('1.2')  --Need to list in result

--Any record without a number
SELECT TOP 10 *
FROM @WorkOrderHistory WO  
WHERE WO.WorkOrder NOT like '%[0-9]%'

【问题讨论】:

  • 请提供示例输出,即您希望查询返回的结果。
  • @tsHunter 用预期的输出更新了问题
  • 所以您正在寻找其中没有整数的列? 123.23$2,302 怎么样?
  • @AdmiralAdama 123.23 应该列在结果中。对于我的情况,这不仅仅是一个数字。我将更新问题中的示例。

标签: sql sql-server


【解决方案1】:

[] 括号内的克拉 (^) 表示匹配除列表中的字符之外的任何字符。因此,如果您想匹配除 0-9 之外的任何字符,则使用 [^0-9] 并且 LIKE(不带 NOT)将匹配所有其他字符。

这应该可行:

SELECT TOP 10 *
FROM @WorkOrderHistory WO  
WHERE WO.WorkOrder LIKE '%[^0-9]%'

当然,您会匹配所有标点符号,以及不可打印的字符。

通过http://technet.microsoft.com/en-us/library/ms174214(v=sql.110).aspx

【讨论】:

  • 为什么这被否决了?我认为它有效...我进行了编辑以详细说明。
  • 我没有...问题上没有橙色箭头,但我很乐意投票反对;我认为这是一个很好的问题。
  • OP 说他不能匹配标点符号
  • 我以为他说他确实想要标点符号:“123.23 应该列在结果中”是 OP 的引述。这会返回“1.2”和“$1”,我仍然认为这是请求。
  • 啊抱歉,当我扫描您的答案时,我弄混了匹配的逻辑。我想这就是答案+1
【解决方案2】:

从销售中选择 * 其中名称不像 '%[0-9]%'

【讨论】:

  • 尝试解释和详细说明您的查询
【解决方案3】:

使用IsNumeric

SELECT * FROM (
    Select isNumeric(workorders) as isNumber,WorkOrder from table @workorderhistory) AS BOB
WHERE BOB.isNumber = 0

【讨论】:

  • isNumeric 如果数字可转换为数字,则返回 1。它不会扫描字符串中的数字。
  • IsNumeric 接受像 $1,000.00 这样的货币金额。
  • OP 只想查看列是数字还是字符的混合。所以在这种情况下 IsNumeric 将给出所需的值,说明该列是否只是一个数字
  • 你为什么不直接做WHERE ISNUMERIC(workorders) != 1而不是子查询?
  • @michealmgriff ops edit 在写答案的过程中出现,我只是还没有改变它
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2021-12-21
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多