Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中模式匹配期间将列值从实数据类型转换为字符串_Sql_Sql Server - Fatal编程技术网

SQL查询中模式匹配期间将列值从实数据类型转换为字符串

SQL查询中模式匹配期间将列值从实数据类型转换为字符串,sql,sql-server,Sql,Sql Server,我在SQL数据库中有一个名为“customer”的表,该表的列名为“customer\u no”,数据类型为real。“客户号”列中包含的数据如下: customer_no ........ ........ 54213154 11011011 11011012 11011013 11011014 11011215 11011015 11011101 45121478 ........ ........ 我想使用通配符模式匹配检索以1101开头的列值。我正在使用SQLServerManagem

我在SQL数据库中有一个名为“customer”的表,该表的列名为“customer\u no”,数据类型为real。“客户号”列中包含的数据如下:

customer_no
........
........
54213154
11011011
11011012
11011013
11011014
11011215
11011015
11011101
45121478
........
........
我想使用通配符模式匹配检索以1101开头的列值。我正在使用SQLServerManagementStudio。我进行了以下SQL查询以获得结果:

select * from customer
where CONVERT(VARCHAR(100), customer_no) like '1101%';

但问题是,我得到0行作为输出。上面的问题有什么不对吗?如何获得所需的结果?

如果客户编号是整数,为什么不使用:

where customer_no >=  11010000 and
      customer_no <  11020000
      
其中客户号>=11010000和
客户号<11020000

您需要先将实数转换为数字

 CREATE TABLE #customer
 (
   customer_no real
 )

 INSERT INTO #customer(customer_no) SELECT 54213154
 INSERT INTO #customer(customer_no) SELECT 11011011
 INSERT INTO #customer(customer_no) SELECT 11011012
 INSERT INTO #customer(customer_no) SELECT 11011013
 INSERT INTO #customer(customer_no) SELECT 11011014
 INSERT INTO #customer(customer_no) SELECT 11011215
 INSERT INTO #customer(customer_no) SELECT 11011015
 INSERT INTO #customer(customer_no) SELECT 11011101
 INSERT INTO #customer(customer_no) SELECT 11021014
 INSERT INTO #customer(customer_no) SELECT 45121478

 SELECT * FROM #customer
  WHERE CONVERT(VARCHAR(100),CONVERT(NUMERIC, customer_no)) like '1101%';

  DROP TABLE #customer

当值转换为字符表示时,它使用的是科学符号,这就是模式不匹配的原因

数学有用吗

where cast(floor(customer_no) as int) /
  cast(power(10, floor(log10(customer_no) - 3)) as int) = 1101
    -- note that floor(log10(1101)) = 3

您得到的另一个建议似乎很合理,因此这实际上只适用于id长度可变的情况。使用浮点数作为id只会让人头疼。

您使用的是MySQL还是MS SQL Server?MS SQL Server@jarlhI想不出任何明显的原因说明您的查询无法工作。再加上你对@GordonLinhoff回答的评论,我相信你已经简化了在这里发布的问题,但这样做可能从根本上改变了问题的性质(甚至有效地消除了问题)。我建议你把问题再复杂一点,客户号的数据类型是什么?我怀疑它不是一个数字,有前导空格或其他什么。数据类型是real@Gordon LinoffI显示了表数据的部分视图。事实上,有更多的数据,我无法将其绑定在您显示的范围内。我想使用通配符模式匹配来推导结果@戈登Linoff@user14216688我认为你应该重新提出你的问题,这样才能清楚为什么戈登的答案不适用。戈登的回答通常可以扩展到许多更复杂的现实世界情况,但我们不能就此向您提供建议,因为我们不知道您的实际情况有多复杂。