【问题标题】:Get ONLY values that contain both a letter and a number仅获取同时包含字母和数字的值
【发布时间】:2018-02-05 15:36:47
【问题描述】:

我在电话栏中很少有这样的垃圾值:

   tel
  -----
  ID# 12
  ID23
  45(ID)
  MYID
  YOUR ID

我希望结果应该是这样的。

   tel
  -----
  ID# 12
  ID23
  45(ID)

我写了一个这样的查询:

   PATINDEX('%[^a-zA-Z0-9]%',TEL) = 0

但是,我没有得到例外结果。任何人都可以提供线索吗?谢谢。

【问题讨论】:

  • 你想要的结果背后的逻辑是什么?您只想返回包含数字的结果?
  • 是的,我想要 (ID# 12 ID23 45(ID))。那只是数字和字母。
  • 如果您正在寻找垃圾值,为什么没有返回 MYID 和 YOUR ID?这些似乎不太可能是电话号码的有效值。
  • 请注意,任何只想知道某些内容是否与模式匹配的查询都可以使用 LIKE,而不是将 PATINDEX 的结果与 0 进行比较。仅当您需要 PATINDEX第一场比赛的位置。我提到这一点是因为您的问题和几个答案都以不添加任何内容的方式使用它。

标签: sql-server sql-server-2016


【解决方案1】:

请试试这个解决方案---

CREATE TABLE testtel
(
    tel VARCHAR(100)
)
GO

INSERT INTO testtel VALUES
('ID# 12'),
('ID23'),
('45(ID)'),
('MYID'),
('YOUR ID')
GO

解决方案

SELECT * 
FROM testtel
WHERE PATINDEX('%[0-9]%',tel) > 0

输出

tel
-----------------------------
ID# 12
ID23
45(ID)

(3 rows affected)

【讨论】:

  • 我试过了,它不起作用。不确定,为什么?注意:尝试使用 LTRIM 和 RTRIM。还有其他线索吗?
  • 你的列的数据类型是什么?
  • 列的类型是Char(15)
  • 使用 Char(15) 它对我有用。 SELECT * FROM testtel1 WHERE PATINDEX('%[0-9]%',CAST(tel AS VARCHAR(MAX))) > 0 你能告诉我你得到什么输出吗?您使用的是哪个 SQL Server?
【解决方案2】:

如果您想获取包含至少一个字母和至少一个数字的所有值,您可以简单地检查两者,每个都在它自己的 patindex 中:

SELECT tel
FROM TableName
WHERE PATINDEX('%[a-zA-Z]%',tel) > 0 
AND PATINDEX('%[0-9]%',tel) > 0

更新
正如 Jeroen Mostert 在他的评论中所写,Like 应该做同样的事情,只是更好:

SELECT tel
FROM TableName
WHERE tel LIKE '%[a-zA-Z]%'
AND tel LIKE '%[0-9]%'

【讨论】:

  • 我试过了,它不起作用。不确定,为什么?注意:尝试使用 LTRIM 和 RTRIM。还有其他线索吗?
  • 我不知道你说的not working是什么意思。你有错误吗?
  • 没有错误。但是,我没有得到想要的结果。
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多