【问题标题】:How to check if a numeric column value is in ascending or descending order. eg. 12345 or 654321如何检查数值列的值是升序还是降序。例如。 12345 或 654321
【发布时间】:2022-01-02 07:48:57
【问题描述】:

我需要有关 SQL 查询的帮助,以检查数字列是否包含按升序或降序排列的数字。

例如。 123456 或 654321

这是为了避免人们在客户电话号码栏中输入一些随机值,要求用户输入有效的电话号码。

我想在不使用函数的情况下实现这一点。


更新:@LukStorms 很好地回答了我的问题。非常感谢。
感谢其他查看我的问题并离开 cmets 的人。但是,如果评论有助于解决问题,我将不胜感激。我的情况不同,我不能在这里发布整个用例。问题是我必须以相同的方式验证该列。

【问题讨论】:

  • 服务器端验证方案尝试使用正则表达式模式或其他随机逻辑来过滤掉电子邮件地址和电话号码的错误输入,几乎总是给有效客户带来不便。我建议您研究使用验证码/URL 向号码发送 SMS 并处理响应的方案。
  • 感谢@AlwaysLearning 的回复。此验证只能在数据库中完成,我也不允许使用 CLR 函数。所以只是寻找一个 TSQL 脚本。
  • 有什么收获?如果有人想给你一个假号码,而你告诉他们 123456 无效,他们只会做 445566 或离开。同时,如果我的电话号码恰好是 403-812-3456,你也会疏远我。您不能强迫某人向您提供有效信息;努力使产品足够引人注目(或要求它们)以提供真实数据。电子邮件地址和电话号码都可以使用 2FA 式确认来完成。阻止您认为不可能的序列是错误的方法。
  • 如果客户输入了虚假电话号码,您应该将此视为他们不希望您通过电话联系他们并且认为这是必需的,因此请将该字段设为可选,可能是您仍然会以假数字告终,但更难发现。如果在购买时遇到这种情况,我可能会输入您的公司编号。一般来说,您应该让客户体验尽可能顺畅

标签: sql-server tsql


【解决方案1】:

要检查它是否像一个数字序列?
然后你可以简单地使用LIKE

select num
, cast(case 
  when '1234567890123456789' like concat('%',num,'%')
   then 1 
  when '9876543210987654321' like concat('%',num,'%')
   then 1 
  else 0 end as bit) as isSequence
from (values 
(123456),
(765432),
(797204)
) nums(num)
num isSequence
123456 True
765432 True
797204 False

或使用CHARINDEX

select num
, cast(case 
  when 0 < charindex(concat(num,''),'1234567890123456789') then 1 
  when 0 < charindex(concat(num,''),'9876543210987654321') then 1 
  else 0 end as bit) as isSequence
from (values 
(123456),
(765432),
(797204)
) nums(num)

dbfiddle here

上的演示

【讨论】:

  • 非常感谢@LukStorms。它工作完美。但是,只是想知道您为什么重复该序列两次。 '01234567890' 还不够吗?
  • 当它以更高的数字开头时。 F.e. 890123。如果你确定它只有 6 位数字,然后 '012345678901234' 就可以了。
猜你喜欢
  • 2018-09-23
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多