Как выбрать строку, которая появляется в текстовом списке? - PullRequest
0 голосов
/ 20 мая 2009

У меня есть таблица клиентов SqlServer

customer (first_name, last_name, home_phone, cell_phone)

и список телефонных номеров, например

9876543210,
4564561234,
1231231234,
1234567890,

Номера телефонов в таблице клиентов хранятся в формате + 1dddddddddd: где dddddddddd - номер телефона.

Как найти все записи клиентов, в которых номер домашнего или сотового телефона указан в текстовом списке?

Текстовый список имеет длину около 1000 номеров, поэтому в идеале я бы хотел вставить их только один раз. Как я могу создать временную таблицу чисел для выполнения запроса?

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

Но это не соответствует формату номера телефона клиента, а проверяет только номер домашнего телефона, а не номер мобильного телефона.

Ответы [ 5 ]

1 голос
/ 20 мая 2009

Чтобы загрузить значения в таблицу, используйте:

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
        )

Не используйте SUBSTRING в home_phone и cell_phone: это предотвратит использование индексов для доступа к этим полям и сделает ваш запрос менее эффективным.

0 голосов
/ 20 мая 2009
SELECT * FROM customer WHERE home_phone = REPLACE("+1", "", "+19876543210");

Проверьте другие интересные функции MySQL здесь: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

0 голосов
/ 20 мая 2009

Я бы использовал подстроку номера телефона для сравнения. Например:

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'
  ))
0 голосов
/ 20 мая 2009

Для жаворонка вы можете попробовать поместить числа в объект xml, который выглядит как массив (т.е. вы можете передать это как параметры в хранимую процедуру), а затем записать его в отношение и объединить его с таблицей клиентов. :

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
0 голосов
/ 20 мая 2009

Вы можете использовать OR для проверки нескольких условий и SUBSTRING, чтобы лишить лидирующего +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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...