2015-10-05 20 views
6

Tôi đang cố gắng để có được một số từ một cơ sở dữ liệu ODBC trong Elixir. Tôi có thể thấy kết quả của tôi trở lại, tuy nhiên, tôi không biết làm thế nào để trích xuất các giá trị.Làm thế nào để trích xuất số nguyên từ danh sách với tuple trong Elixir?

{:ok, conn} = :odbc.connect('DSN=mydsn;UID=myuid;PWD=mypwd', []) 
{:selected, _colNames, rows} = :odbc.sql_query(conn, 'select count(*) from mytable') 

{: đã chọn, [ 'đếm'], [{ '182'}]}

Làm thế nào để tôi nhận được 182 hiện như một số nguyên?

Gần nhất tôi đã được nhận được tuple nội:

hd(rows) 

{ '182'}

+0

Tôi không biết liệu nó có hiệu quả với những gì bạn cần nhưng bạn cũng có thể muốn xem Ecto: https://github.com/elixir-lang/ecto –

Trả lời

5

Có nhiều giải pháp khác nhau thể tùy thuộc cho dù bạn đang quan tâm đến trường hợp cụ thể hoặc theo cách tiếp cận rộng hơn.

Trong trường hợp cụ thể này, vì rows được mong đợi là danh sách có một bộ đơn với một giá trị duy nhất, bạn có thể tận dụng lợi thế của mẫu phù hợp để trích xuất giá trị.

{:selected, _, [{count}]} = {:selected, ['COUNT'], [{'182'}]} 

Từ thời điểm này count sẽ khớp với '182'. Tuy nhiên, xin lưu ý rằng '182' khác với "182"

"182" == '182' 
false 

Như đã giải thích trong tài liệu Elixir, '182' is a char-list trong khi "182" là một String. Do đó bạn không thể sử dụng trực tiếp String.to_integer vì nó sẽ không thành công.

String.to_integer(count) 
** (ArgumentError) argument error 
    :erlang.binary_to_integer('182') 

Trước tiên, bạn cần sử dụng List.to_integer(count) hoặc cách khác chuyển đổi thành chuỗi, sau đó truyền đến một số nguyên.

List.to_integer(count) 
182 

String.to_integer(to_string(count)) 
182 

Giải pháp này có thể không áp dụng trực tiếp nếu bộ chứa nhiều giá trị (có nghĩa là truy vấn trả về nhiều hơn một giá trị). Tuy nhiên đó là một điểm khởi đầu bạn có thể thích ứng với nhu cầu của bạn.

+2

Bạn có thể sử dụng 'List.to_integer (count) 'để chuyển đổi nó trực tiếp từ danh sách thành số nguyên. –

+0

Cảm ơn @ JoséValim. Tôi đã cập nhật câu trả lời. –

Các vấn đề liên quan