【问题标题】:Is it possible to query for a specific data type?是否可以查询特定的数据类型?
【发布时间】:2014-03-18 15:43:51
【问题描述】:

我想知道是否可以编写一个仅在该字段包含某种数据类型时才返回该字段的查询。

例如,我可能希望从搜索中返回数据类型为 VARCHAR 或数据类型为 BIGINT 的所有字段。不只是搜索包含数字或字母的字段。

这是我的伪代码示例:(我知道这不是很令人印象深刻):

select *
from dbo.REP_ALIAS ra
where ra.TRADE_REP [= data type integer] --integer is just an example

是否有某种方法可以对所有数据类型执行此操作,而不仅仅是整数。

另外:我正在使用 T-SQL 和 MS SQL Server 2008 R2。

【问题讨论】:

  • 嗯,我在询问更多有关查询“任何”特定数据类型的信息,而不仅仅是数值。我只是以整数值为例。重复发帖当然不是我的本意。
  • SQL 中任何字段的数据类型都是在创建字段(又名列)时设置的。所以我想你可能想问一个字段的值是否可以转换(或强制转换)为另一种类型?这将取决于谁在进行更新,以及他们的能力:如果您存储字符串“2014 年 3 月 1 日”,谁来确定这是否是合法日期以及是在一月还是三月? SQL 对此有一些规则,但它们有时与 .NET 转换不同
  • 一个字段实际上总是只包含一种数据类型,因为它是在创建(或更改)时定义的。
  • 宾果游戏。这就是我一直在寻找的答案。如果您将其发布为答案,我可以接受。

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

您可以排除非数字

WHERE ra.TRADE_REP NOT LIKE '%[^0-9]%'

【讨论】:

  • 这太好了,谢谢。查找非数值是否也会反向工作?可能是这样的NOT LIKE '%[^a-z]%'
  • 正好相反的LIKE '%[^0-9]%'。 (请注意,如果您想包含 - 符号,则需要处理)
【解决方案2】:

你可以使用 -

> WHERE ISNUMERIC(field)

来源:Checking for numeric value in field + SQL Server

【讨论】:

  • 谢谢,我不知道有这个功能。你知道是否有一个匹配函数可以找到一个不是数字的值吗?或者我可以按照Case When ISNUMERIC(field) = null 的方式做点什么吗?
  • 是的,你当然可以使用它。应该是Case When ISNUMERIC(field)=1 then 'Yes' else 'No'End
  • ISNUMERIC 可能有点奇怪,前导制表符、货币符号、十六进制/八进制符号都被视为数字。
  • 在这种情况下,您可以使用like '%[^0-9]%' - 如亚历克斯的回答所述。
  • 这些都是很好的答案,但我想知道是否有一种更标准的方法可以根据该数据类型查找仅具有某种数据类型的字段。例如,我可能希望从搜索中返回数据类型为 VARCHAR 或数据类型为 BIGINT 的所有字段。不只是搜索包含数字或字母的字段。那有意义吗?如果需要,我可以详细说明。
【解决方案3】:

SQL 中任何字段的数据类型都是在创建字段(又名列)时设置的。所以我想你可能想问一个字段的值是否可以转换(或强制转换)为另一种类型。

这将取决于谁在进行转换,以及他们的能力:如果您存储字符串“2014 年 3 月 1 日”,谁来确定这是否是合法日期以及是在一月还是三月? SQL 对此有一些规则,但它们有时与 .NET 转换不同。

如果该字段设置为字符串(通常为NVARCHARVARCHAR),则它只能包含字符串而不是真正的日期时间值。这是 SQL 中许多 hack 的来源,但最好的答案是将字段设置为正确的数据类型。有时这涉及多个字段,几乎是多余的,用于不同类型的数据。

这个页面的大约一半是一个带有 SQL 原生类型的图表,可以转换为其他类型: http://msdn.microsoft.com/en-us/library/ms187928.aspx

【讨论】:

    【解决方案4】:

    此问题已在此处的 stackoverflow 上提出:Check if a varchar is a number (TSQL)
    或此处Checking for numeric value in field + SQL Server

    select *
    from dbo.REP_ALIAS ra
    where ISNUMERIC(ra.TRADE_REP) = 1
    

    【讨论】:

    • 感谢您的回答,但我问的是一般查询数据类型,而不仅仅是数值。我仅以数值为例。我已经更新了我的 OP 以使其更加清晰。
    猜你喜欢
    • 2011-12-21
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多