menggunakan IF di MySQL (bukan fungsinya)

Saya memiliki pertanyaan yang terasa sederhana, tetapi sepertinya tidak dapat menjawabnya dengan benar. Saya hanya mencoba menjalankan logika IF ... THEN ... biasa, tetapi sepertinya tidak bisa melakukannya dengan benar:

set @var:=2;
if @var=1 THEN select 'hello';

Saya mendapat:

KESALAHAN 1064 (42000):

Anda mengalami kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk mengetahui sintaks yang tepat untuk digunakan di dekat 'if @var=1 LALU pilih 'hello'' di baris 1

Apa yang saya lewatkan?


person Mordechai    schedule 12.11.2012    source sumber
comment
Anda dapat mengeksekusi pernyataan ini hanya dalam prosedur atau fungsi.   -  person juergen d    schedule 12.11.2012
comment
hampir sulit dipercaya. apakah mereka punya pembenaran atas persyaratan yang begitu kejam dan tidak biasa?   -  person Mordechai    schedule 12.11.2012


Jawaban (2)


Anda bisa, tetapi hanya di dalam fungsi, prosedur, dan pemicu seperti:

DELIMITER //
DROP PROCEDURE IF EXISTS anyname//
CREATE PROCEDURE anyname()
BEGIN
    IF @var1 = 1 THEN
        SELECT 'hello';
    END IF;
END//
SET @var1 := 1;
CALL anyname()//
person eisberg    schedule 12.11.2012
comment
Saya pikir kita semua memerlukan rincian lebih lanjut tentang tujuan Anda sebelum kami dapat menawarkan jawaban yang memenuhi syarat. - person eisberg; 12.11.2012
comment
detail apa? Saya mulai berpikir bahwa saya satu-satunya yang pernah menggunakan pernyataan kondisional dalam mode batch :) Jika Anda memerlukan informasi tambahan, silakan tanyakan. - person Mordechai; 12.11.2012
comment
berikut adalah salah satu contoh solusi yang saya temukan. Meskipun ingin menghindarinya jika saya bisa: stackoverflow.com /pertanyaan/9899663/ - person Mordechai; 12.11.2012
comment
Jadi Anda tidak dapat memasukkan skrip Anda ke dalam suatu prosedur? - person eisberg; 13.11.2012
comment
tidak dalam kasus ini. Saya hanya akan menggunakan solusi yang aneh. terima kasih. - person Mordechai; 13.11.2012

Anda dapat menggunakan CASE sebagai gantinya.

SET @var:=2; 
SELECT CASE WHEN @var=1 THEN 'hello' ELSE 'no hello' END;
--prints 'no hello'

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN 'hello' ELSE 'no hello' END;
--prints 'hello'

Saya harap idenya jelas dengan contoh di atas.

Sunting: untuk mengatasi masalah tambahan OP, Anda dapat memasukkan selects dalam case pernyataan, namun Anda harus mengapitnya dalam tanda kurung. Misalnya.

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN (select 'hello') ELSE (select 'no hello') END;

Satu hal yang perlu diperhatikan adalah ia harus mengembalikan hanya satu nilai (dari satu baris dan satu kolom)

person nawfal    schedule 12.11.2012
comment
terima kasih, tetapi ini tidak akan berfungsi untuk sesuatu yang sedikit lebih rumit seperti misalnya: if @var=1 select *from tableX else select * frm tableY - person Mordechai; 12.11.2012
comment
@MorDeror seperti apa? Saya yakin ada jalan keluarnya - person nawfal; 12.11.2012
comment
@MorDeror itu berfungsi juga. lihat hasil edit saya. Jika Anda memberi tahu kami apa sebenarnya yang ingin Anda capai, kami dapat membantu dengan lebih baik - person nawfal; 12.11.2012
comment
terima kasih @nawfal, tetapi mengembalikan satu kolom saja mungkin tidak akan mencakup sebagian besar kasus penggunaan - person Mordechai; 12.11.2012
comment
@MorDeror Ya itu tidak akan mencakup sebagian besar kasus, tetapi Anda harus mengambil beberapa kolom melalui logika jika ada bau kode. Saya mencium cacat desain. Saya meminta Anda untuk memposting persyaratan sebenarnya, akan selalu ada alternatif yang lebih baik - person nawfal; 12.11.2012
comment
Menurut saya, mengambil data dari tabel tertentu dengan kondisi tertentu bukanlah kesalahan desain yang parah. :) Sejauh yang awalnya saya kejar adalah memeriksa apakah ada baris sebelum mencoba menyisipkan. - person Mordechai; 12.11.2012
comment
@MorDeror bukan, dan itulah mengapa Anda memiliki WHERE dan CASE dan IF tetapi keduanya dimaksudkan untuk tujuan yang berbeda. Anda agak menanyakan fungsionalitas WHERE di CASE. Jika Anda ingin memasukkan secara kondisional maka itu adalah hal yang sama sekali berbeda tetapi dapat dilakukan dengan mudah dibandingkan peretasan ini. Lihat tautan ini untuk contoh stackoverflow.com/questions/13302714/ Ada banyak tautan serupa lainnya juga di SO - person nawfal; 12.11.2012
comment
terima kasih. Ini memecahkan masalah saya, meskipun memaksakan pendapat saya bahwa MySQL tidak boleh digunakan untuk pekerjaan DB yang sebenarnya. :) - person Mordechai; 12.11.2012
comment
Terima kasih kembali. Saya setuju MySQL bukanlah yang terbaik di luar sana. Ini sama sekali tidak kaya fitur dibandingkan dengan Dbms-es lainnya - ia tidak berpotongan, kecuali/minus, kemampuan berputar, fungsi jendela dan lebih jauh dari std ANSI SQL dibandingkan dengan pemain besar lainnya, tidak melupakan hal-hal tidak logis yang memungkinkan kita lakukan dengannya kelompokkan menurut. Tapi alasan mengapa ini begitu populer adalah karena mudah, sesuatu yang saya suka. Bukan hanya secara sintaksis tetapi bahkan dengan tidak membatasi kita dengan hambatan. - person nawfal; 12.11.2012