SELECT TOP (100) PERCENT
ACODE * 10 + CCODE AS Aコード,
ACODE * 1000 + CCODE * 100 + GCODE AS Bコード,
CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END AS 番地,
MIN(DISTINCT X) AS X,
MIN(DISTINCT Y) AS Y
FROM
dbo.Tbl
GROUP BY
ACODE * 10 + CCODE, ACODE * 1000 + CCODE * 100 + GCODE, CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END
ORDER BY
字丁目コード, 号特定コード, 番地


上記のクエリを実行すると「データ型 nvarchar を float に変換中にエラーが発生しました。」というメッセージが表示されてしまいます。
おそらく[CHIBAN]フィールドはnvarchar型のためエラーが発生していると思うのですが、
なぜ強制的にfloat型にしようとするのかわかりません。

どのように回避すればよいでしょうか。ご教示のほどお願い致します。

「SQLserver2005 nvarch」の質問画像

A 回答 (1件)

>CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END



上記のCASE文の[GCODE]が数値型のようなので暗黙の型変換が行われているのでしょう。

なので、[CHIBAN]内に文字列が入っていて変換できないのでしょう。

戻り値の型
http://msdn.microsoft.com/ja-jp/library/ms181765 …
>result_expressions およびオプションの else_result_expression の型のセットの中から、最も優先順位の高い型を返します。詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。

データ型の優先順位
http://msdn.microsoft.com/ja-jp/library/ms190309 …

CASTで文字列に明示的に変換すればよいでしょう。
http://msdn.microsoft.com/ja-jp/library/ms187928 …

データ
[GCODE] [CHIBAN]
0A
01
03
1A
1B


エラーケース
select
CASE WHEN [GCODE] = 0 THEN
[CHIBAN]
ELSE
[GCODE]
END AS 番地
from test

オッケーケース
select [GCODE],[CHIBAN],
CASE WHEN [GCODE] = 0 THEN
[CHIBAN]
ELSE
CAST([GCODE] AS nvarchar(10))
END AS 番地
from test

GCODECHIBAN番地
0A A
01 1
03 3
1A 1
1B 1

Select時には型を合せましょう。
    • good
    • 0
この回答へのお礼

ご親切な回答ありがとうございます。
解決いたしました。

>Select時には型を合せましょう。
Accessで慣れていたもので。。。お恥ずかしいです。

ありがとうございます。助かりました。

お礼日時:2009/05/12 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qmultiple definitionというエラー

現在Ubuntu LinuxのgccでC言語のプログラムをやっています。

https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2452/trunk/20140411/code.h

このツリーのcode.hに ”const sig_code2_t PVC_TCP_SIG_CODE[100] = {” というコードを追加してmakeを行うと次のようなエラーが出て実行ファイルが出力されません。



(エラー内容)

---------------(中略)-----------------
gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o mount.o net.o misc.o -lpthread
event.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
env.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
audio.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
task.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
comm.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
mount.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
net.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
misc.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [exe] Error 1






この const sig_code2_t PVC_TCP_SIG_CODE[100] = {をコメントアウト正常にビルドできるのですが、




この問題を解決するにはどうすれば良いのかご教示頂きますようお願い致します。

現在Ubuntu LinuxのgccでC言語のプログラムをやっています。

https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2452/trunk/20140411/code.h

このツリーのcode.hに ”const sig_code2_t PVC_TCP_SIG_CODE[100] = {” というコードを追加してmakeを行うと次のようなエラーが出て実行ファイルが出力されません。



(エラー内容)

---------------(中略)-----------------
gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o mount.o net.o misc.o -lpthread
event.o:(.rodat...続きを読む

Aベストアンサー

お約束の「ヘッダに実体を定義してはいけない」ってヤツです。

code.hに記述した内容はall_includes.hに適用されます。
all_includes.h内で#include "code.h"していますからね。

で、all_includes.hの内容はそれぞれ
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
つまり、code.hに記述した内容も
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
それぞれのオブジェクトファイルにPVC_TCP_SIG_CODE[100]が存在します。

リンクする段階でどのオブジェクトファイルのPVC_TCP_SIG_CODE[100]を使用したらいいのでしょうか?????
というエラーです。

extern宣言して、実体をどこかのソースファイルのみに記述する。
というのが一般的な対処方法です。
# static宣言にすればとりあえずリンクは通るかもしれませんが…無駄が出ますねぇ。
# 今回はconstなので、メモリに無駄が出るだけ…で済むかと思われますが。
http://d.hatena.ne.jp/saitodevel01/20110321/1300685958

お約束の「ヘッダに実体を定義してはいけない」ってヤツです。

code.hに記述した内容はall_includes.hに適用されます。
all_includes.h内で#include "code.h"していますからね。

で、all_includes.hの内容はそれぞれ
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
つまり、code.hに記述した内容も
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
それぞれのオブジェクトファイルにPVC_TCP_SIG_CODE[100]が存在します。...続きを読む

Q計算結果をCASE WHENで判断したとき、ELSEで計算結果をそのまま持ってくるSQL文法は?

SQL SERVER2005を使用しています。
テーブルAがあり、Aが持つフィールド「suuchi」には数値が入っているとします。


suuchiフィールドの値を計算して、その結果が0以上なら計算結果を。負の数なら0を出力するSQL文を書きたいのです。
CASE WHEN を使用して以下のSQLを書きました。

SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 END FROM テーブルA;

しかし、結果は計算結果が負の数の場合は「0」になりますが、0以上の場合が表示されませんでした。
理由は、CASE WHEN でELSEを省略した場合、結果がNULLになるためと思われます。
以下のSQLでは期待とおりの結果が得られます。

SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 ELSE ( suuchi*2 + 1 ) END FROM テーブル;

しかし、同じ計算式を2回書くのは今一正しくないように思えます。
CASE WHEN で計算結果を判断した場合、ELSEでは計算済みの結果を取ることはできないのでしょうか?
上は例として書いたので簡単な計算式ですが、実際私が業務で使用している計算式はかなり長いため
できれば式を2回書くことを避けたいのです(SQL文が長くなるため)。

計算結果に一時的に別名をつけようとして、以下のようなSQL文を書いたのですが「AS 付近にエラーがあります」といわれます。
SELECT CASE WHEN ( suuchi*2 + 1 ) AS TMPFIELD < 0 THEN 0 ELSE TMPFIELD END FROM テーブル;


質問は2点です。
1) 計算式の結果をCASE WHEN で判断した場合、ELSEの時は計算結果を取得したい場合は、再度同じ計算式を書く必要がありますか?
2) 上の答えが「必要ない」場合、上記条件を満たすSQLの書き方をご教示いただけませんでしょうか?


なお、質問文の文章、SQLServerの環境の記述不足、SQL文等で意味不明な箇所がありましたらご指摘ください。
以上です。よろしくお願いします。

SQL SERVER2005を使用しています。
テーブルAがあり、Aが持つフィールド「suuchi」には数値が入っているとします。


suuchiフィールドの値を計算して、その結果が0以上なら計算結果を。負の数なら0を出力するSQL文を書きたいのです。
CASE WHEN を使用して以下のSQLを書きました。

SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 END FROM テーブルA;

しかし、結果は計算結果が負の数の場合は「0」になりますが、0以上の場合が表示されませんでした。
理由は、CASE WHEN でELSEを省略した場合、結...続きを読む

Aベストアンサー

case文を使う場合は、
case when 式1 then 0 else 式1 end
のように、同じ式を書く必要があります。

計算結果がnullになるような場合なら、
coalesce(式1,0)
といった関数を使う方法もありますが、今回は該当しませんね。

式に別名を付けた場合、そのクエリ内でなく、その外側のクエリでなら、別名で操作できます。
select
EX1
from (select *,suuchi*2+1 as EX1 from tbl1) as x

Qbear the definitions

bear the definitions
という場合、このbearはどういう訳となるのでしょうか?


Bold and capitalized terms not defined herein bear the definitions in the Competition Packet.
という文で使われていました。

「ここで定義していない太字と大文字表記は、Competition Packetに定義されている」という意味でしょうか?

Aベストアンサー

yes

QSQLサーバーは[main]![No]というようなSQL文は駄目?

[main]![No]と言う風に「!」を使ったSQL文を実行すると
「'!' 付近に不適切な構文があります。」
のメッセージが表示されます。

アクセスでは問題なく行くのですが。

SQLサーバー → [main.No]
アクセス→ [main]![No]、or [main.No]

という決まりがあるのですか?

Aベストアンサー

下記にサイトからの情報を転載します。
SQL Serverでは、ピリオドしか想定していないようです。
Oracleもそうだったと思います。
MySQLも・・・。
どちらかというと「!」のほうがイレギュラーになるんだと思います。


オブジェクト名としての識別子の使用
http://msdn.microsoft.com/ja-jp/library/ms187879.aspx

サーバー名、データベース名、および所有者名は、オブジェクト名の修飾子です。
オブジェクトを参照するときに、サーバー、データベース、および所有者を指定する必要はありません。
修飾子の位置をピリオドで示せば、修飾子を省略できます。オブジェクト名の有効な形式には、次のものがあります。
server_name . database_name . schema_name . object_name
server_name . database_name .. object_name
server_name .. schema_name . object_name
server_name ... object_name
database_name . schema_name . object_name
database_name .. object_name
schema_name . object_name
object_name

下記にサイトからの情報を転載します。
SQL Serverでは、ピリオドしか想定していないようです。
Oracleもそうだったと思います。
MySQLも・・・。
どちらかというと「!」のほうがイレギュラーになるんだと思います。


オブジェクト名としての識別子の使用
http://msdn.microsoft.com/ja-jp/library/ms187879.aspx

サーバー名、データベース名、および所有者名は、オブジェクト名の修飾子です。
オブジェクトを参照するときに、サーバー、データベース、および所有者を指定する必要はありません。
修...続きを読む

Qウィンドウズのアップデートで10月20日に、Definition Up

ウィンドウズのアップデートで10月20日に、Definition Update for wWindows Defender-KB015597(Definition 1.93.26.0)が2回インストールされましたが、そのあとにもう一つ「更新プログラムをインストールしています(50パーセント完了)」とありますが、今日で3日連続表示され、インストールが進みません。なにか解決方法はないでしょうか?PCは初心者クラスです。よろしくお願いします。

Aベストアンサー

>今日で3日連続表示され、インストールが進みません。
ちょっと状況がつかめません。
毎日の起動時に同じ内容が表示されることが3回続いた、ということでしょうか。それとも、72時間の間ずっと「(50パーセント完了)」の状態なのでしょうか。

前者なら
http://menushowdelay.blog13.fc2.com/blog-entry-523.html
とその中のリンクを。
後者なら、とりあえず再起動しましょう。

Qnvarcharとdatetimeで作成された日付の抽出方法について

SQL Server 2005 EXPRESSを使って、
nvarchar型で作成されたyyyy/mm/ddの日付と
datetime型で作成されたyyyy/mm/ddの日付を比較し
WHERE '2007/05/04' > gettime()のようなSELECT文の
WHERE句を使って該当レコードを表示することが可能であれば
教えてください。

以上、宜しくお願いします。

Aベストアンサー

CONVERT関数を使うとできます。
たとえば。
現在日時が 2007/05/22 17:48:10 だとします。
GETDATE()でその現在日時がDateTime型でとれます。
これをCONVERT関数を通して日付部分だけをnVarChar型に変換します。

CONVERT(NVARCHAR, GETDATE(), 111)

最後の「111」がフォーマットの指定で、「yyyy/MM/dd」形式で日付だけを持ってくる指定になります。

詳しくは参考URLのCONVERTの引数styleをご覧ください。

参考URL:http://msdn2.microsoft.com/ja-jp/library/ms187928.aspx

QOn Error GoTo でエラーが発生する

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

   Do
   On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
   On Error GoTo 0
   Loop

ErrorTrap2:

End Sub

しかし、以下のようにSubで二つに分けるとエラーは出ません。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
    On Error GoTo 0
    Loop

  ErrorTrap2:

End Sub

「On Error GoTo 0」がうまく解除できていないのかと思い、いろいろ試してみました。
しかし、どういった理由かはわかりませんでした。
「On Error GoTo」は、Subでは、ひとつしか使えないのでしょうか。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

   Do
   On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
   On Error GoTo 0
   Loop

ErrorTrap2:

End Sub

しかし、以下のようにSubで二つに分けるとエラーは出ません。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error G...続きを読む

Aベストアンサー

エラー処理の中でOn Error GoToを記述することはできません。


エラー処理の基本的な構造は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Exit Sub

ErrorTrap1:
  'エラー処理
  Resume Next

End Sub


エラー処理が2つある場合は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Do
  On Error GoTo ErrorTrap2
    '-エラーの発生するコード 2
  On Error GoTo 0
Loop

Exit Sub

ErrorTrap1:
  'エラー処理1
  Resume Next

ErrorTrap2:
  'エラー処理2
  Resume Next

End Sub


Resume Next でエラーが発生した行の次の行から再開します。
Resumeには他の構文もありますので、調べてみてください。

エラー処理の中でOn Error GoToを記述することはできません。


エラー処理の基本的な構造は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Exit Sub

ErrorTrap1:
  'エラー処理
  Resume Next

End Sub


エラー処理が2つある場合は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Do
  On Error GoTo ErrorTrap2
    '-エラーの発生するコード 2
  On Error GoTo 0
Loop

Exit Sub

...続きを読む

Qnvarchar型で指定して文字列幅を越えた文字列をクエリした場合のエラー

nvarchar型で文字列幅を(255)と指定したテーブルに、指定幅を越えた文字列にてクエリを送った場合に、エラーがはきだされると思ったのですが、
なぜか吐き出されません。

超過していた文字列が黙って切り捨てられた文字列で、insertが完了します。

エラーをだしたいのですが、そもそもエラーをなくすような設定があるのでしょうか?

Aベストアンサー

確証が得られていないので、自信はないのですが、

SQL Serverの接続オプションで、ANSI_WARNINGS、ARITHABORT、
ARITHIGNOREがOffだと、エラーは発行しなかったかと思います。

なので、
http://technet.microsoft.com/ja-jp/library/ms190707.aspx
をみながら、サーバ設定を変更するか、
サーバ設定変更が容易にできない環境にある場合は、
INSERT処理を行っているストアドや、ストアドじゃなく普通にINSERT
している場合は、下記のようにしてみてください。
(エラー番号とメッセージが出たような記憶があります)

■ストアドの場合のイメージ

-- エラーメッセージを表示するよう設定
set ANSI_WARNINGS on
set ARITHABORT on
SET ARITHIGNORE on
go
-- INSERT処理用のストアド
CREATE PROCEDURE XXXXXX
AS
BEGIN
  問題のINSERT文の実行
END

■普通にINSERTしている場合
set ANSI_WARNINGS on
set ARITHABORT on
SET ARITHIGNORE on
go
問題のINSERT文の実行


的外れだったら、すいません。

確証が得られていないので、自信はないのですが、

SQL Serverの接続オプションで、ANSI_WARNINGS、ARITHABORT、
ARITHIGNOREがOffだと、エラーは発行しなかったかと思います。

なので、
http://technet.microsoft.com/ja-jp/library/ms190707.aspx
をみながら、サーバ設定を変更するか、
サーバ設定変更が容易にできない環境にある場合は、
INSERT処理を行っているストアドや、ストアドじゃなく普通にINSERT
している場合は、下記のようにしてみてください。
(エラー番号とメッセージが出たような記...続きを読む

Qステレオミキサーの「realtek high definition a

ステレオミキサーの「realtek high definition audio 6.0.1.5490」より新しいバージョンのものはありますか?更新したいので。

Aベストアンサー

こんばんは。

現状ですと、[R2.47]の"6.0.1.6083"が最新のようです。
RealtekのOHPからダウンロードできます。
http://www.realtek.com.tw/downloads/downloadsCheck.aspx?Langid=4&PNid=24&PFid=24&Level=4&Conn=3&DownTypeID=3&GetDown=false

Q[SQL Server 2005] CLR によるテーブルへの INSERT

SQL-SERVER 2005 Standerd-Edition と Visual Studio 2005 を使用して、VC# で CLR によるストアドプロシージャを作成しています。

apache の accesslog を正規表現で整形し、必要な項目を抽出してからtable へ INSERT しようとしています。

http://www.atmarkit.co.jp/fdb/rensai/sqls05try05/sqls05try05_2.html
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_09/vs2005db_09_03.html
http://www.codeguru.pl/forum-posts-6460-4.aspx

このあたりの記事を参考に、どうにかできるようにはなりました。しかし、accesslog が膨大なサイズのため、1行ずつ SQL 文を発行して INSERT していると、10時間前後かかってしまっています。(1,500万record 程度になっています)


何行かずつでも、『まとめて』 INSERT する方法はないものでしょうか。




※正規表現で整形したものを tab区切りで text 出力し(これは10数分で終わります)、それをウィザードを使用して import すると小一時間で済んだりします。

現状、accesslog の import だけなので、それでもよいのですが、今後は既存の table に対して正規表現を用いて何らかの集計を行っていく予定でいます。数千万 record の table を扱っていくことを考えると不安です。^^;


そもそも CLR を「正規表現が使いたい」というだけの理由で導入していること自体、少々お恥ずかしい心持なのですが、もしヒントになるような情報をお持ちの方がいらっしゃれば、ご教授願えませんでしょうか。

SQL-SERVER 2005 Standerd-Edition と Visual Studio 2005 を使用して、VC# で CLR によるストアドプロシージャを作成しています。

apache の accesslog を正規表現で整形し、必要な項目を抽出してからtable へ INSERT しようとしています。

http://www.atmarkit.co.jp/fdb/rensai/sqls05try05/sqls05try05_2.html
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_09/vs2005db_09_03.html
http://www.codeguru.pl/forum-posts-6460-4.aspx

このあたりの記事を参考に、どうにかできるようにはなり...続きを読む

Aベストアンサー

Insert ではなく バルクコピー
Select Into  で #TempFile テンポラリーファイルに必要な
データを出力し、その後Select Union文でマージする。
方法ではいかがでしょうか?
Select Into でテンポラリーファイルに出力する際にCLR関数を使って
抽出すればいいのでは・・・


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング