У меня есть база данных sqlite3, в которой у меня повреждены данные. Я квалифицируюсь как «коррумпированный» со следующими характеристиками:
Данные в столбцах имени, телефона, широты и долготы повреждены, если: значение равно NULL или "" или длина <2 </p>
Данные в столбце адреса повреждены, если значение равно NULL или "" или числу слов <2, а длина слова <2 </p>
Чтобы проверить это, я написал следующий скрипт на Ruby:
require 'sqlite3'
db = SQLite3::Database.new('development.sqlite3')
db.results_as_hash = true;
#Checks for empty strings in name, address, telephone, latitude, longitude
#Also checks length of strings is valid
rows = db.execute(" SELECT * FROM listings WHERE LENGTH('telephone') < 2 OR LENGTH('fax') < 2 OR LENGTH('address') < 2 OR LENGTH('city') < 2 OR LENGTH('province') < 2 OR LENGTH('postal_code') < 2 OR LENGTH('latitude') < 2 OR LENGTH('longitude') < 2
OR name = '' OR address = '' OR telephone = '' OR latitude = '' OR longitude = '' ")
rows.each do |row|
=begin
db.execute("INSERT INTO missing (id, name, telephone, fax, suite, address, city, province, postal_code, latitude, longitude, url) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", row['id'], row['name'], row['telephone'], row['fax'], row['suite'], row['address'], row['city'], row['province'],
row['postal_code'], row['latitude'], row['longitude'], row['url'] )
=end
id_num = row['id']
puts "Id = #{id_num}"
corrupt_name = row['name']
puts "name = #{corrupt_name}"
corrupt_address = row['address']
puts "address = #{corrupt_address}"
corrupt_tel = row['telephone']
puts "tel = #{corrupt_tel}"
corrupt_lat = row['latitude']
puts "lat = #{corrupt_lat}"
corrupt_long = row['longitude']
puts "lat = #{corrupt_long}"
puts '===end===='
end
#After inserting the records into the new table delete them from the old table
=begin
db.execute(" DELETE * FROM listings WHERE LENGTH('telephone') < 2 OR LENGTH('fax') < 2 OR LENGTH('address') < 2 OR
LENGTH('city') < 2 OR LENGTH('province') < 2 OR LENGTH('postal_code') < 2 OR LENGTH('latitude') < 2 OR LENGTH('longitude') < 2
OR name = '' OR address = '' OR telephone = '' OR latitude = '' OR longitude = '' ")
=end
Это работает, но я новичок в программировании на Ruby и DB. Поэтому я буду рад любым предложениям, чтобы сделать этот запрос лучше.
Конечная цель, которую я имею, состоит в том, чтобы запустить скрипт в моей базе данных, который проверяет достоверность данных в ней, и если некоторые данные являются недействительными, они копируются в другую таблицу и удаляются из первой таблицы.
Кроме того, я хотел бы добавить к этому запросу тест для проверки наличия дублирующих записей.
Я квалифицирую запись как дубликат, если более 1 строки имеют одно и то же имя, один и тот же адрес, один и тот же телефон, одинаковую широту и одинаковую долготу
Я пришел с этим запросом, но не уверен, что он самый оптимальный:
SELECT *
FROM listings L1, listings L2
WHERE L1.name = L2.name
AND L1.telephone = L2.telephone
AND L1.address = L2.address
AND L1.latitude = L2.latitude
AND L1.longitude = L2.longitude
Любые предложения, ссылки, помощь будет принята с благодарностью