如何选择文本列表中显示的行?

时间:2009-05-20 13:54:16

标签: sql-server tsql

我有一个SqlServer客户表

customer (first_name, last_name, home_phone, cell_phone)

等电话号码的文本文件列表
9876543210,
4564561234,
1231231234,
1234567890,

客户表中的电话号码以+ 1ddddddddddd格式存储:其中ddddddddddd是电话号码。

如何找到家庭或手机号码出现在文本列表中的所有客户记录?

文本列表大约有1000个数字,所以理想情况下我只想粘贴一次。我怎样才能创建一个临时的数字表来进行查询?

SELECT first_name, last_name
FROM customer
WHERE home_phone IN (
  SELECT * FROM temporary_table
)

但这与客户电话号码格式不符,只检查家庭电话号码,而不是手机号码。

5 个答案:

答案 0 :(得分:1)

要将值加载到表中,请使用:

CREATE TABLE numbers (number VARCHAR(20))

BULK INSERT numbers
FROM 'c:\path_to\numbers.csv' 
WITH 
( 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\r\n' 
)

注意,服务器可以通过此路径访问'c:\path_to\numbers.csv',而不是客户端。

这意味着为您的服务器运行的帐户设置权限。

要查询,请使用:

SELECT  *
FROM    customer
WHERE   home_phone IN
        (
        SELECT  '+1' + number
        FROM    numbers
        )
        OR cell_phone IN
        (
        SELECT  '+1' + number
        FROM    numbers
        )

不要在SUBSTRINGhome_phone上使用cell_phone:这会阻止使用索引访问这些字段并降低查询效率。

答案 1 :(得分:0)

您可以use an OR to check multiple conditionsSUBSTRING to strip the leading +1

SELECT first_name, last_name
FROM customer
WHERE SUBSTRING(home_phone,3,10) IN (
  '9876543210',
  '4564561234',
  '1231231234',
  '1234567890'
)
OR SUBSTRING(cell_phone,3,10) IN (
  '9876543210',
  '4564561234',
  '1231231234',
  '1234567890'
)

SUBSTRING函数不是标准ANSI SQL,因此数据库之间会略有不同,例如它可能被称为SUBSTR

答案 2 :(得分:0)

我会使用电话号码的子字符串进行比较。例如:

select first_name
     , last_name
  from customer
 where ( substring(home_phone, 2, 10) in (
                       '9876543210',
                      '4564561234',
                      '1231231234',
                      '1234567890'
  )
  OR  substring (cell_phone, 2, 10) in (
                       '9876543210',
                      '4564561234',
                      '1231231234',
                      '1234567890'
  ))

答案 3 :(得分:0)

对于云雀,您可以尝试将数字放在一个看起来像数组的xml对象中(即您可以将其作为参数传递给存储过程)然后将其拖放到关系中并将其与您的customer表连接:

declare @numbers xml
set @numbers = '<numbers>
<number value="9876543210"/>
<number value="4564561234"/>
<number value="1231231234"/>
<number value="1234567890"/>
</numbers>'

SELECT first_name, last_name 
FROM  customers
join @number.nodes('//number') as t(c)
 on c.value('@value','varchar(10)') = '+1'+customers.homephone

答案 4 :(得分:0)

SELECT * FROM customer WHERE home_phone = REPLACE("+1", "", "+19876543210");

在这里查看其他很酷的MySQL字符串功能: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html