• 締切済み

SQLserverのIF文について

どうしてもIF文がうまくいきません IF文の中にIFを入れ子していますそのIFが複数の条件があります 今までACCESSではELSEIFで条件をいくらでも指定できたのですがSQLの場合はエラーになってしまいます ご教授おねがいします ------------------------------ set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[scfc_part端数処理] ( @PTHASU nvarchar(10), @haken nvarchar(10) ) RETURNS real AS BEGIN DECLARE @PARTT real DECLARE @PARTT_H real if (not(@PTHASU is null)) if @haken='派遣' or @haken='臨時' if substring(@PTHASU,4,2)>= 50 SET @PARTT = convert(int,LEFT(@PTHASU,2)+1)*60 --ここをいれるとエラー IF substring(@PTHASU,4,2)< 50 and substring(@PTHASU,4,2)>= 20 --ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 +30 --ここをいれるとエラー if substring(@PTHASU,4,2)< 20 --ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 ELSE SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 + convert(real,substring(@PTHASU,4,2))*1 ELSE SET @PARTT= 0 SET @PARTT_H = convert(real,(floor(@PARTT/60*10000)/10000)) RETURN @PARTT_H END

みんなの回答

  • SRL311
  • ベストアンサー率100% (2/2)
回答No.2

こんな感じかな。 if a > b   begin     if b > c       begin         if c > d           begin             set @ABC=1           end         else           begin             set @ABC=2           end       end     else       begin         set @ABC=3       end   end else   begin     set @ABC=4   end

hiyotom
質問者

お礼

すみません SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 +30のかっこがぬけていていました 以下のように完成できました ありがとうございました -------------------------------- set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[scfc_part端数処理] ( @PTHASU nvarchar(10), @haken nvarchar(10) ) RETURNS real AS BEGIN DECLARE @PARTT real DECLARE @PARTT_H real if (not(@PTHASU is null)) if @haken='派遣' or @haken='臨時' begin if substring(@PTHASU,4,2)>= 50 SET @PARTT = convert(real,LEFT(@PTHASU,2)+1)*60 else IF substring(@PTHASU,4,2)< 50 and substring(@PTHASU,4,2)>= 20 SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 +30 else SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 end ELSE SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 + convert(real,substring(@PTHASU,4,2))*1 ELSE SET @PARTT= 0 SET @PARTT_H = convert(real,(floor(@PARTT/60*10000)/10000)) RETURN @PARTT_H END

回答No.1

マニュアルを読みましょう。 if 条件 真の時の命令文 else 偽の時の命令文 で、真または偽で命令文を2個以上書く場合は、begin~endでブロックを構成する必要があります。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/ms182717.aspx
hiyotom
質問者

お礼

すみません SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 +30のかっこがぬけていていました ありがとうございました

関連するQ&A

  • 関数の戻り値の確認について

    accessで関数を使用していました sqlserverでのスカラ値関数を設定しましたが戻り値を確認したいのですがprintを記述すると関数の中では使用できませんとエラーになってしまいます?戻り値を確認する方法はないでしょうか じつは下記ストアドから関数を呼び出して結果をテーブルにインサートすると小数点以下のデータが消えています?そこで戻り値が正しいか確認したいのです。accessの場合には少数以下正常に出ます なにかprgの記述がまちがっているのでしょうかご指導おねがいします ----INSERT INTO ストアド----Sum(dbo.scfc_残業時間([残業H])) AS 残業Z----GROUP BY ****---- ------スカラ値関数---dbo.scfc_残業時間---------------------------- set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[scfc_残業時間] ( @ZAN nvarchar(5)) RETURNS real AS BEGIN DECLARE @ZANGYOU int DECLARE @ZANGYOU_H real if (not(@ZAN is null)) if len(@ZAN)= 4 SET @ZANGYOU = convert(int,LEFT(@ZAN,1))*60 + convert(int,substring(@ZAN,3,2))*1 ELSE SET @ZANGYOU = convert(int,LEFT(@ZAN,2))*60 + convert(int,substring(@ZAN,4,2))*1 ELSE SET @ZANGYOU= 0 IF @ZANGYOU > 0 SET @ZANGYOU_H = floor(@ZANGYOU/60*10000)/10000 RETURN @ZANGYOU_H END

  • select文で int を yyyy-mm-dd に変換したい

    つまり「20040102」のデータを「2004-01-02」という文字型に変換したいのですが? select substring(convert(nvarchar, f1, 1,4) + '-' + substring(convert(nvarchar, f1, 5,2) + '-' + substring(convert(nvarchar, f1, 7,2) from tbl1 だと一応変換はしてくれるのですが,面倒なのが「0」というデータがある場合 '0--'というふうに出てきてしまうのです int → char 20041123 → '2004-11-23' 0 → '' '' → '' という形に変換できないでしょうか?

  • T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい

    お世話になります。 SQLserver2005でユーザー定義関数に初めてトライしているのですが デバッグツールがなく、うまく動かない理由がわからず困っております。 ある文字列に対して、指定したバイト数までの文字を返すような関数を作りたいです。VBAでいうLEFT関数のバイト数指定版というのでしょうか。(すでにそんな関数があったりして。。) 以下のように作ってみたのですが、無限ループのようで、いつまでたってもデータが返ってきません。。どなたか教えていただけませんでしょうか? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[LeftByte] (@value nvarchar,@maxbyte bigint) RETURNS nvarchar(max) AS BEGIN declare @Countvalue as bigint declare @byte as bigint declare @result as nvarchar select @byte = 0 select @Countvalue = 0 select @result = '' while @byte < @maxbyte begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte >= @maxbyte break else continue end RETURN @result END 宜しくお願い致します。

  • elseif文の中のif文のところで

    今、c言語の勉強をしていまして、 演習問題のプログラムを作成しています。 elseif文の中のif文のところで エラーが出てしまうのですが・・・。 ご教授して頂けたら幸いです。 #include<stdio.h> int main(void) { int kyori,untin; printf("ようこそ \n"); printf("距離を入力してください->"); scanf("%d", &kyori ); if(kyori < 5) untin = 120; else if(kyori >= 5 && kyori < 21) untin = ((kyori-4)/2*20)+120; else if(kyori >= 21 && kyori < 1000) untin = ((kyori-20)/5*40)+280; //7840円 else if(kyori >= 1000 ) untin = ((kyori-1000)/10*50)+8120 ここでエラー→→→ if(untin <> 0) untin = untin + 50; printf("運賃は%dです。",untin); }

  • VBA 単純なIF文ですが?

    以下のような文を書いたときに、If文の後の変数を「set_s」にした場合イコールが実行されません。 「set_s」を単純な数字(この場合16)にするとIf文が機能します。 なぜでしょうか。 Do set_s = 16 Cells(1, 1) = Time h = Left(Time, 2) m = Mid(Time, 4, 2) s = Right(Time, 2) If set_s = s Then Cells(8, 2) = "時間です。" Exit Do Else Cells(8, 2) = "まだです。" End If Loop

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • phpのif文について

    phpでログイン処理のif文を書いています。 nameとpasswordのフィールドが記入されているのかをチェックするif文を書いたのですが、機能してくれません。何かが間違っているのでしょうか。 何も入力しないor間違った情報を入力する ということをしてもログインが出来てしまいます。 どなたかテェックお願い致します。 <?php require('dbconnect.php'); session_start(); if ($_COOKIE['name'] != '') { $_POST['name'] = $_COOKIE['name']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); // ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('name', $_POST['name'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • 0~4以外の際のif文

    0~4以外のif文を作りたいのですが ↓のif文を色々変化させたのですが、4より大きくなおかつ0より小さいという結果が出ませんでした。 どこか間違ってるのだと思うのですが・・・ a<0で0ではないことはコンパイルして0ではないことは判明しました。 a<5もやってみましたが・・・。 int a; scanf("%d",&a); if(a < 5 && a < 0){ 4 より大きい & 0より小さい else 0~4以外 関数などは使いません。よろしくお願いします

  • SQLでwhileやIFを使った場合の返り値について

     urizakaと申します。  さて、最近までSQLというのはselectやINSERTなどを使ってデータ ベースをいじるものだという認識しかなかったのですが、実は「IF」や「ELSE」 も組み込むことができると聞いて、さっそくプログラミングを組んでみました declare @i int declare @result int set @i = 0 while @i < 10 begin set @i = @i + 1 select @result=count(code_staff_client) from t_issue where code_staff_client=@i if @result != 0 BREAK end  これは、t_issue というテーブルを検索して、コード番号10までの 人間がいるかどうかを調べるためのSQL文なのですが、さて、この時に 条件に適合したら返り値として値1を返して処理を終わるというSQL文 にしたいのですが、この場合返り値についてどのように宣言すれば 良いのでしょうか?  このあとからわからなくなってしまったもので・・・すみませんが、ご存知 の方宜しくお願いします。

  • if文が機能しません

    初歩的な質問でお恥ずかしいのですが、簡単なif文が、機能してくれません。 良かったら、アドバイスよろしくおねがいします 以下がソースとなります。 double x, a; x=(int) (rand() / (RAND_MAX+1.0) * 100); if (0 <= x < 50) {        a=1; } else {        a=2; } これなんですが、結果が全てa=1となってしまい、分岐してくれません。 なぜでしょうか?