包含日期的 SQL Server 字符串。不了解 LIKE 的行为'%[0-9]%'



我的目标是在包含日期的表中获取列名。它们看起来像"SMTH_2000/01/01"。

如果我使用

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME LIKE '%_[0-9]%'

工作正常,但也返回带有数字的列(显然)

如果我使用

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME LIKE '%_[0-9]/[0-9]%'

工作也还可以。我认为"嗯,"_[0-9]/"能够找到"_"和"/"之间有 4 个数字的字符串

我试图执行此查询(在末尾再添加一个斜杠):

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME LIKE '%_[0-9]/[0-9]/%'

它没有用。

有人可以解释为什么在一种情况下它将 [0-9] 与 4 个数字(而不是一个)匹配,而在另一种情况下它没有?我试图"谷歌"答案,但没有找到关于这个的东西。

这是你的模式

SMTH_2000/01/01

用于匹配此模式的 SQL ServerLIKE模式可能是:

%[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]%
^^ 4 digit year     ^^ month   ^^ day

试试这个完整的查询:

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'MY_TABLE' AND
COLUMN_NAME LIKE '%[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]%'

如@PanagiotisKanavos所述,从性能的角度来看,以这种方式处理日期可能并不理想,因为它会使 SQL Server 的日期函数的所有功能都无法使用。 如果您计划经常运行此类查询,则可以在某个时候将日期提取到单独的日期列中。

您可以使用以下满足 your 模式的查询

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_TABLE' 
AND COLUMN_NAME LIKE '%_[0-9][0-9][0-9][0-9]/[0-9][0-9]/%'

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_TABLE' 
AND COLUMN_NAME LIKE '%_[0-9]/[0-9][0-9]/%'

最新更新